Bash - 尝试读取多个文件并基于行打印

时间:2014-02-11 23:18:51

标签: bash shell

所以这是我的代码几乎可以工作但不应该停止它。

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个文件。任何人都可以提供任何有关为何发生这种情况的见解吗?

2 个答案:

答案 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通配符通配而不是解析,例如。

#!/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

特别是你的方式不起作用的原因是它正在测试每一行,而不是每个文件。