所以我的代码几乎可以工作,但不会在应该停止的时候停止。
function quit {
exit
}
for file in `ls /var/tmp/animals/ | grep -v animals`
do
cat $file | awk '/foo/ { print "OK" } !/foo/ { print "NOK"}'
done
quit
它读取目录/var/tmp/animals 中的文件,如果文件包含单词 foo,它会在该行上打印 OK,如果没有,它会在该行上打印 NOK。
对于目录中的 4 个文件,它工作正常,但它不会停止并继续随机打印 20 行 NOK 和 OK。目录中只有 4 个文件。谁能提供任何关于为什么会发生这种情况的见解?
发生这种情况是因为awk
每行运行一次表达式,而不是为每个文件运行一次。这是修复程序。
您需要替换此行:
cat $file | awk '/foo/ { print "OK" } !/foo/ { print "NOK"}'
自
grep -l "foo" $file >/dev/null && echo "OK" || echo "NOK"
可以在一行中轻松完成此操作
find /var/tmp/animals/ -maxdepth 1 -mindepth 1 -type f -not -name '*animal*' -exec bash -c 'grep -q "foo" "$0" && echo "OK" || echo "NOK" ' {} ;
如果要使用 for
循环,请使用 bash 通配符通配符而不是解析 ls,例如
#!/bin/bash
for file in /var/tmp/animals/*; do
if [[ -f $file && $file != *animal* ]]; then
grep -q "foo" "$file" && echo "OK" || echo "NOK"
fi
done
具体来说,您的方式不起作用的原因是它正在测试每一行,而不是每个文件。