用grep

时间:2016-02-25 19:13:11

标签: bash if-statement while-loop grep

我正在尝试报告使用grep和while找到的行。

我知道您可以使用以下内容来比较inputs.txt中的字符串列表,并在目标文件中找到它们,如下所示:

grep -f inputs.txt file_to_check

我想要的是读取输入字符串的每一行并在循环中单独grep它们。

所以我尝试了以下方法:

cat inputs.txt | while read line; do if grep "$line" filename_to_check; then echo "found"; else echo "not found"; fi; done

当我将输出重定向到文件时,这不会返回任何内容。

while read line
do
if grep "$line" file_to_check
  then echo "found"
else 
  echo "not found"
fi
done < inputs.txt

与第一个相同,但我发现的更好。

我知道它逐行迭代,因为我可以用echo $ line替换grep并打印每一行;但是这两种方法都没有像上面的grep -f那样返回任何内容,而是显示:

not found
not found
not found
.
. etc.

所以我正在寻找的是它会遍历每一行并通过grep使用if语句检查它以确定grep是否实际找到它。我知道我可能没有所有正确的逻辑,但我想要的输出应该看起来像:

Found *matching line in file_to_check* 
Found *matching line in file_to_check*
Not Found $line *(string that does not match)*
.
. etc.

4 个答案:

答案 0 :(得分:4)

您还可以使用&&||运营商:

while read line; do
         grep -q "$line" file_to_check  && echo "$line found in file_to_check" || echo "$line not found in file_to_check"
done < inputfile > result.txt

grep的-q参数只输出状态代码:

  • 如果找到$line,则会在评估0之后发出&&(True)命令
  • 如果找不到,则在评估1后输出||(False)命令

答案 1 :(得分:1)

您可以将最终解决方案重写为

# Do not need this thanks to tr: file=$(dos2unix inputs.txt)

# Use -r so a line with backslashes will be showed like you want
while read -r line
do 
   # Not empty? Check with test -n
   if [ -n "$(grep "${line}" filename)" ]; then 
      echo "found: ${line}"
   else
      echo "not found: ${line}"
   fi 
done < <(tr -d "\r" < "${file}")

答案 2 :(得分:0)

好吧,你的if语句是非常自由的形式,你可能需要清理一下bash能够读取它。例如:

Demo.java

如果grep命令找到该行,则此if语句将评估为true,因为如果这样做,则会将该行吐出,并且不等于“”或空字符串。

答案 3 :(得分:0)

这是我的最终解决方案:

file=$(dos2unix inputs.txt)
new_file=$file

while read line
do 
  if [ "$(grep "$line" filename)" != "" ]
    then echo "found: $line"
  else echo "not found: $line"
  fi 
done <$new_file

再次感谢!