gpt4 book ai didi

bash - 检查一个文件中的字符串是否出现在另一组文件中,列出那些没有的

转载 作者:行者123 更新时间:2023-12-04 10:51:52 24 4
gpt4 key购买 nike

我有一种情况,我有大量文件,我需要检查它们是否包含列出的字符串,每行一个,在另一个文件中,并报告它们没有的地方。 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

最佳答案

既然你利用了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 条目

关于bash - 检查一个文件中的字符串是否出现在另一组文件中,列出那些没有的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com