【问题标题】:Grep finding which of the pattern ARE NOT in the filegrep 查找哪些模式不在文件中
【发布时间】:2021-08-23 10:25:09
【问题描述】:

我正在尝试找出 (grep) 文件中的哪些模式没有出现在日志文件中。
我有文件input.txt,其中包含:

00123
00124
00125
00126

和日志文件20210716.log

00123
a
b
c
d
00125
00126
xy
z
...
(tons of text)
...
00127

当在输出中使用grep -f input.txt 20210716.log 时,我得到:

00123
00125
00126

如何从input.txt 输出未出现在日志文件中的模式?,所以我想得到:

00124

【问题讨论】:

    标签: linux unix grep


    【解决方案1】:

    你可以试试这个grep:

    grep -vFf file.log input.txt
    
    00124
    

    否则你可以像这样使用 awk:

    awk 'NR == FNR {seen[$1]; next} !($0 in seen)' file.log input.txt
    
    00124
    

    【讨论】:

      【解决方案2】:

      这取决于你真正想要什么。你谈论模式,匹配模式很难。例如,如果您的输入文件包含应匹配的单词,您可以使用以下内容:

      $ grep -woFf input.txt file.log | grep -vwoFf - input.txt
      

      这会将文件 input.txt 读取为要搜索的模式列表 (-f),但假定这些模式是固定字符串而不是正则表达式 (-F)。我们还假设我们只想匹配完整的单词(-w)并且只输出匹配的内容(-o)。该命令的输出被反馈到grep 的管道中,我们将所有找到的单词作为固定字符串 (-woFf -) 进行反向 (-v) 匹配。

      这里的问题是如果input.txt包含实际的正则表达式,反向grep不起作用(你不能搜索foo并尝试匹配可能出现在input.txt中的正则表达式fo* .

      更安全的匹配是使用awk

      awk '(NR==FNR){a[$1];next}
           {for(r in a) a[r]+=(r~a)}
           END{for(r in a) if (a[r]==0) print r}
          ' input.txt file.log
      

      【讨论】:

        猜你喜欢
        • 2012-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多