加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 比较两个greps的输出

发布时间:2020-12-16 01:50:48 所属栏目:安全 来源:网络整理
导读:我有两个带有大量定义的C源文件,我想将它们相互比较并过滤掉不匹配的行. 第一个文件的grep(grep NO_BCM_ include / soc / mcm / allenum.h | grep -v 56440)输出可能如下所示: ......# if !defined(NO_BCM_5675_A0)# if !defined(NO_BCM_88660_A0)# if !def
我有两个带有大量定义的C源文件,我想将它们相互比较并过滤掉不匹配的行.
第一个文件的grep(grep NO_BCM_ include / soc / mcm / allenum.h | grep -v 56440)输出可能如下所示:

...
...
# if !defined(NO_BCM_5675_A0)
# if !defined(NO_BCM_88660_A0)
# if !defined(NO_BCM_2801PM_A0)
...
...

其中grep(grep“定义NO_BCM”包括/ sdk_custom_config.h)的第二个看起来像:

...
...
#define NO_BCM_56260_B0
#define NO_BCM_5675_A0
#define NO_BCM_56160_A0
...
...

所以现在我想在上面的大括号中找到下面#define中缺少的任何类型编号.我最好怎么做?
谢谢

解决方法

您可以使用带有两个进程替换处理程序的awk逻辑用于grep

awk 'FNR==NR{seen[$2]; next}!($2 in seen)' FS=" " <(grep "define NO_BCM" include/sdk_custom_config.h) FS="[()]" <(grep NO_BCM_ include/soc/mcm/allenum.h | grep -v 56440)
# if !defined(NO_BCM_88660_A0)
# if !defined(NO_BCM_2801PM_A0)

想法是<()中的命令将根据需要执行并生成输出.在输出之前使用FS是为了确保使用适当的分隔符来解析公共实体. FS =“[()]”是捕获$2作为第二组中的唯一字段,FS =“”用于第一组的默认空白限制. awk的核心逻辑是识别不重复的元素,即FNR == NR将存储$2中的唯一条目的第一组解析为散列映射.一旦解析了所有行,就会在第二组上执行!(看到$2),这意味着过滤那些第二组中的$2在创建的哈希中不存在的行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读