当且仅当文件名不包含字符串foo
时,我想打印出该文件的名称。但是,如果file
包含foo
并且我运行此
grep -lv 'foo' file
输出 file
。为什么会发生这种情况,我该怎么做才能解决它?
答案 0 :(得分:5)
grep -lv
表示:列出包含不匹配行的每个文件。
您正在寻找grep -L
。
grep -L 'foo' file
答案 1 :(得分:5)
-v
表示匹配与模式不匹配的任何行。因此-lv
表示列出包含与模式不匹配的任何行的任何文件。这与行的 none 匹配模式的文件不同。
使用-L
选项列出与模式没有任何匹配的所有文件。
grep -L 'foo' file
-L, --files-without-match
抑制正常输出;而是打印每个输入文件的名称,通常不会打印输出。该 扫描将在第一场比赛中停止。
请勿使用-v
。 -L
已经反映了列出的文件,-v
颠倒了匹配行的方式,因此-Lv
与-l
相同。
答案 2 :(得分:1)
你应该删除-v选项,因为这意味着它将省略任何行中给出的文本。所以你应该尝试:
grep -L 'foo' Input_file
另外,如果你想知道目录中有字符串(foo)的所有文件,那么你也可以尝试一下。
grep -L 'foo' /path/to/files/*.txt
grep -L的一个示例,它将打印所有包含字符串foo的.txt文件名。
编辑:如果您对awk解决方案感兴趣,也可以尝试关注。
awk 'val{close(val)} FNR==1{val=FILENAME} /Var/{;print FILENAME;nextfile}' *.txt