我正在尝试报告使用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.
答案 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
再次感谢!