所以这是我的代码几乎可以工作但不应该停止它。
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个文件。任何人都可以提供任何有关为何发生这种情况的见解吗?
答案 0 :(得分:0)
这是因为awk
为每一行运行一次表达式,而不是每个文件运行一次。这是修复。
您需要替换此行:
cat $file | awk '/foo/ { print "OK" } !/foo/ { print "NOK"}'
到
grep -l "foo" $file >/dev/null && echo "OK" || echo "NOK"
答案 1 :(得分:0)
可以在一行中轻松完成这项工作
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
特别是你的方式不起作用的原因是它正在测试每一行,而不是每个文件。