【问题标题】:Search for files that contain 2 or more occurrences of a specific word between text with new lines在带有换行符的文本之间搜索包含 2 次或多次出现特定单词的文件
【发布时间】:2020-12-30 04:19:13
【问题描述】:

我需要搜索包含 2 次或多次出现特定单词的文件(在我的情况下为 NORMAL),因此请从以下文件中搜索:

file1.txt

the NORMAL things are [

    - case
    - case 2
    
    a NORMAL is like [

        - case 3
        - case 4
        
    ]
    
]

file2.txt

the NORMAL things are [

    - case
    - case 2
    
    a DIFFERENT is like [

        - case 3
        - case 4
        
    ]
    
]

file3.txt

the NORMAL things are [

    - case
    - case 2
    
]

它只会找到 file1.txt

我试过一个简单的grep:

grep -Ri "*NORMAL*NORMAL*" .

但它不起作用。

谢谢

【问题讨论】:

  • 标题与您的描述相矛盾,关于您搜索的模式。只是NORMAL 还是带有NORMAL 的任何行,仅当下一行和上一行为空或只有空白字符而不是文件边界时。
  • NORMAL 出现在FOONORMALBAR 中时是否匹配?如果您想要查找的 rtsing 是 foo.bar 而不是 NORMAL - foo.bar 是否会匹配 fooXbar?只是想找出您是否需要完全或部分匹配以及正则表达式或字符串匹配。我认为您需要全字串匹配,但到目前为止,大多数答案都使用部分匹配,其中只有一个使用字符串匹配,其余的都使用正则表达式匹配。

标签: string bash search grep


【解决方案1】:

使用 grep -o 选项:

例如:

grep -o NORMAL file1.txt | wc -l --> 2
grep -o NORMAL file2.txt | wc -l --> 1
grep -o NORMAL file3.txt | wc -l --> 1

现在这可以与 if claus 一起使用:

if [ `grep -o NORMAL file1.txt | wc -l` -ge 2 ];then echo "Count is greater than or equal to 2";else echo "Count is less than 2";fi

【讨论】:

    【解决方案2】:

    fgrep -c 'NORMAL' 文件* | awk -F ":" ' $NF >= 2 { 打印 }'

    file1.txt:2

    如果你也想打印搜索结果,那么

    fgrep -c 'NORMAL' 文件* | awk -F ":" ' $NF >= 2 { 打印 }' | grep NORMAL $(awk -F ":" '{ print $1}')

    正常的事情是[

    NORMAL 就像 [

    【讨论】:

      【解决方案3】:

      如果您不想递归搜索:

      grep -lzE '(NORMAL).*\1' files*
      

      如果您确实希望递归搜索:

      grep -rlzE '(NORMAL).*\1' .
      

      此命令在当前目录中递归检查包含NORMAL 后跟NORMAL(\1) 的文件。这意味着它将匹配 2 个或更多匹配项。这只是打印文件名,去掉-l打印内容+文件名。

      -l :这只会打印与grep匹配的文件名
      -z:数据行以0字节结尾,而不是换行符
      -E:使用扩展正则表达式-r: 递归

      【讨论】:

        【解决方案4】:

        使用grep -c 打印匹配计数:

        grep -c 'PATTERN' file(s)
        

        在您的情况下,您还需要第二个 grep -Pv 或类似的东西来按匹配数过滤(这里,排除具有 0 或 1 个匹配的文件):

        grep -c 'NORMAL' files | grep -P -v ':[01]$'
        

        这里,
        :[01]: 后跟 0 或 1(选择 0 或 1 个匹配项)。
        $:行尾。

        另请参阅:

        -c
        --count
        抑制正常输出;而是打印每个输入文件的匹配行数。使用 -v (--invert-match) 选项,计数 不匹配的行。 (-c 由 POSIX 指定。)

        -P
        --perl-正则表达式
        将模式解释为与 Perl 兼容的正则表达式 (PCRE)。

        -v
        --反转匹配
        反转匹配的感觉,选择不匹配的行。 (-v 由 POSIX 指定。)

        (来自GNU Grep 3.4

        【讨论】:

          猜你喜欢
          • 2021-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多