【问题标题】:Checking if strings in one file occur in another set of files, list those that don't检查一个文件中的字符串是否出现在另一组文件中,列出那些没有的
【发布时间】:2019-12-22 14:04:06
【问题描述】:

我有一种情况,我有大量文件,我需要检查它们是否包含列出的字符串,每行一个,在另一个文件中,并报告它们不包含的地方。 VLAN列表中的字符串匹配文件和要检查的大量文件是我们核心交换机的'show mac-address'的周期输出,这些是一堆txt文件。我正在使用 Linux Bash shell。

我可以很容易地使用 grep 覆盖匹配...

cat *.txt > [MAC-File] && fgrep -of [VLAN-File] [MAC-File] | sort -h | uniq -c

这给了我一个匹配的 VLAN 列表以及 txt 文件中的行数。这是一个进步,但我需要找到其中没有 MAC 地址的 VLAN,所以我需要扭转逻辑。我的搜索告诉我 grep 与 -o 没有相反的条件,所以我需要找到一个替代方案。这将应用于 3 个非常大的 LAN,每个 LAN 中都有数百个 VLAN,我不想将结果输入到 Excel 电子表格中!

请注意,我正在检查的文件每行的数据比仅 VLAN 编号的数据多,因此比较行不起作用。

要查找(或不查找!)字符串的第一个文件的格式为..

 100
 103 
 230

请注意,我在每个数字之前和之后都有空间以使它们唯一,因此它们仅匹配我正在检查的大数据文件的第二列格式

6c4b-904b-0c5c   230        Learned          BAGG103                  Y

【问题讨论】:

  • 我假设 VLAN 号是第二列?
  • @kvantour 没错——所有文件都是在 Linux 下创建的,所以我相信没有 DOS 格式问题

标签: bash shell grep


【解决方案1】:

由于您使用fgrep,它是grep -F 的同义词,我们知道模式文件是固定字符串。要查找哪些模式不匹配,请使用以下方法:

$ grep -oFf pattern_file search_file | grep -voFf - pattern_file

如果是 OP,则变为:

$ grep -oFf [VLAN-File] [MAC-File] | grep -voFf - [VLAN-File]

您也可以使用 awk 一次性完成:

$ awk '(NR==FNR){a[$0];next}($2 in a){a[$2]++}END{for(i in a) if (a[i]==0) print i}' [VLAN-File] [MAC-File]

以上内容适用于完全匹配,因此不需要额外的空格。如果你想保留多余的空格,那就有点棘手了:

$ awk '(NR==FNR){a[$0];next}
       {for(i in a) if (i ~ $0) a[i]++}
       END{for(i in a) if (a[i]==0) print i}' [VLAN-File] [MAC-File]

以上所有内容都将打印 MAC-File 中未出现的 VLAN-File 条目

【讨论】:

  • 编辑 - 回答自上一条评论延长
  • 恐怕我根本没有从 grep 得到任何输出 - 我还尝试了完全匹配 awk 命令,其中包含一个没有空格的测试搜索文件,并且返回了 '$ : 找不到命令'
  • 运行更长的 awk 确实有效,但似乎输出是肯定的(即它们被发现的地方)而不是否定的,即 VLAN 文件中的字符串没有出现在 MAC 文件中的位置。
猜你喜欢
  • 2017-03-05
  • 2022-12-14
  • 2014-12-26
  • 2017-04-27
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多