Linux GREP显示包含文本和不包含文本的文件

Linux GREP显示包含文本和不包含文本的文件,linux,unix,grep,Linux,Unix,Grep,我正在尝试搜索具有特定文本的文件,但排除了特定文本并仅显示文件 这是我的密码: grep -v "TEXT1" *.* | grep -ils "ABC2" 然而,它返回: (标准输入) 请建议。非常感谢 输出应仅显示文件名 (standard input) 此错误是由于在管道中使用了grep-l,因为您的第二个grep命令正在从stdin而不是从文件读取输入,-l选项正在打印(标准输入),而不是文件名 您可以在单个awk命令中使用此替代解决方案: a

我正在尝试搜索具有特定文本的文件,但排除了特定文本并仅显示文件

这是我的密码:

grep -v "TEXT1" *.* | grep -ils "ABC2"
然而,它返回:
(标准输入)

请建议。非常感谢

输出应仅显示文件名

(standard input)
此错误是由于在管道中使用了
grep-l
,因为您的第二个grep命令正在从stdin而不是从文件读取输入,
-l
选项正在打印
(标准输入)
,而不是文件名

您可以在单个
awk
命令中使用此替代解决方案:

awk'/ABC2/&&/TEXT1/{print FILENAME;nextfile}'*.*2>/dev/null
此错误是由于在管道中使用了
grep-l
,因为您的第二个grep命令正在从stdin而不是从文件读取输入,
-l
选项正在打印
(标准输入)
,而不是文件名

您可以在单个
awk
命令中使用此替代解决方案:

awk'/ABC2/&&/TEXT1/{print FILENAME;nextfile}'*.*2>/dev/null

这里有一种方法,假设您希望在文件中的任何位置匹配这些术语

grep-LZ'TEXT1'*.*xargs-0 grep-li'ABC2'
  • -L
    将匹配不包含给定搜索词的文件
    • 如果您想匹配
      文本1
      而不考虑大小写,请使用
      -LiZ
  • 需要使用
    -Z
    选项以NUL字符分隔文件名,然后
    xargs-0
    将根据NUL字符分隔文件名


如果要在同一行而不是在文件中的任何位置检查这两个条件:

grep-lP'^(?。*TEXT1.*(?i:ABC2)')**
  • -P
    启用PCRE,我假设您已经启用了PCRE,因为
    linux
    被标记
  • (?!regexp)
    是一个负的先行结构,因此
    ^(?。*TEXT1)
    将确保该行没有
    TEXT1
  • (?i:ABC2)
    将不敏感地匹配
    ABC2
    大小写
  • 如果要匹配这两个术语,而不考虑大小写,请使用
    grep-liP'^(?。*TEXT1.*ABC2'

这里有一种方法,假设您希望在文件中的任何位置匹配这些术语

grep-LZ'TEXT1'*.*xargs-0 grep-li'ABC2'
  • -L
    将匹配不包含给定搜索词的文件
    • 如果您想匹配
      文本1
      而不考虑大小写,请使用
      -LiZ
  • 需要使用
    -Z
    选项以NUL字符分隔文件名,然后
    xargs-0
    将根据NUL字符分隔文件名


如果要在同一行而不是在文件中的任何位置检查这两个条件:

grep-lP'^(?。*TEXT1.*(?i:ABC2)')**
  • -P
    启用PCRE,我假设您已经启用了PCRE,因为
    linux
    被标记
  • (?!regexp)
    是一个负的先行结构,因此
    ^(?。*TEXT1)
    将确保该行没有
    TEXT1
  • (?i:ABC2)
    将不敏感地匹配
    ABC2
    大小写
  • 如果要匹配这两个术语,而不考虑大小写,请使用
    grep-liP'^(?。*TEXT1.*ABC2'


我不明白你的第一句话。你能重新措辞吗?您正在查找不包含
TEXT1
的文件名,还是在其内容中不包含
TEXT1
的文件?请查看以下内容:您好,我正在查找不包含TEXT1且包含ABC2Thank的文件。。但是,grep只需要显示文件名..这是有效的:grep-P'(?=^((?!bar)。*)*$)foo'。。。输出文件名:找到术语。如果有必要,你可以把它切碎。我不明白你的第一句话。你能重新措辞吗?您正在查找不包含
TEXT1
的文件名,还是在其内容中不包含
TEXT1
的文件?请查看以下内容:您好,我正在查找不包含TEXT1且包含ABC2Thank的文件。。但是,grep只需要显示文件名..这是有效的:grep-P'(?=^((?!bar)。*)*$)foo'。。。输出文件名:找到术语。如果需要的话,你可以把它切碎。你的解决方案有效。也谢谢你的解释:)非常感谢sundeep。你的解决方案有效。另外,也感谢您的解释:)非常感谢您分享美好的代码先生,您能告诉我为什么我们需要
*.
?这里不能只使用
*
?如果您能解释这一点,我将不胜感激。我使用了
*.
,因为OP也有它,假设文件名中的扩展名为
。好的,如果是
*
文件,则不会拾取
?抱歉,还没有测试它。带有
的文件也将只使用
*
拾取,但它也会拾取目录,而
*.
的限制更严格,仅匹配具有扩展名的文件名。感谢您共享漂亮的代码,先生,您能告诉我为什么我们需要
*
吗?这里不能只使用
*
?如果您能解释这一点,我将不胜感激。我使用了
*.
,因为OP也有它,假设文件名中的扩展名为
。好的,如果是
*
文件,则不会拾取
?抱歉,尚未对其进行测试。带有
的文件也将仅使用
*
拾取,但它也将拾取目录,而
*.
对仅匹配扩展名的文件名的限制更大。