Grep:如果一行包含不需要的字符串,如何排除前后行?

时间:2016-08-17 17:06:49

标签: linux bash shell unix grep

我正在使用diff在2个非常大的程序集转储上运行命令。我看到很多这样的输出:

903c903
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
995c995
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1123c1123
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1191c1191
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1278c1278
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1347c1347
< ; Emitting BLENDED_CODE for generic X86 CPU
---
> ; Emitting BLENDED_CODE for Pentium 4
1546c1546
<        inc      dword ptr [ebp-10H]
---
>        add      dword ptr [ebp-10H], 1
1552c1552
<        inc      esi
---
>        add      esi, 1

我真的不想看到包含“Pentium 4”或“通用X86 CPU”的行;具体来说,如果有一行包含“Pentium 4”,我想排除该行及其上方的3行。

是否可以使用grep执行此操作?我知道grep -v 'Pentium 4',但这只适用于单行。我显然不能grep -v -- '---',因为有一些有效的差异包含三个破折号。

如果grep查询是在上面的代码上运行的,那么结果应该是

1546c1546
<        inc      dword ptr [ebp-10H]
---
>        add      dword ptr [ebp-10H], 1
1552c1552
<        inc      esi
---
>        add      esi, 1

4 个答案:

答案 0 :(得分:4)

我喜欢这里的流程替换。我们假设 file_a 是:

; Emitting BLENDED_CODE for generic X86 CPU                                                                                                                                                          
inc      dword ptr [ebp-10H]

file_b 是:

; Emitting BLENDED_CODE for Pentium 4
add      dword ptr [ebp-10H], 1

正在运行

diff -I "^;" file_a file_b

将返回:

1,2c1,2
< ; Emitting BLENDED_CODE for generic X86 CPU
< inc      dword ptr [ebp-10H]
---
> ; Emitting BLENDED_CODE for Pentium 4
> add      dword ptr [ebp-10H], 1

这不是你想要的。但是,当您尝试使用流程替换时,即

diff <(grep -v '^;' file_a) <(grep -v '^;' file_b)

你会得到:

1c1
< inc      dword ptr [ebp-10H]
---
> add      dword ptr [ebp-10H], 1

答案 1 :(得分:1)

您可以使用-I的{​​{1}}选项排除与diff中某个模式匹配的行:

diff

模式必须由两条线匹配,这就是您需要使用diff -I 'Pentium 4\|generic X86 CPU' file1 file2 (逻辑)运算符使模式与原始模式和更改匹配的原因。

答案 2 :(得分:1)

您可以在bash中使用流程替换来删除源文件中的注释:

diff <(grep -v '^;' file1.s) <(grep -v '^;' file2.s)

答案 3 :(得分:0)

$ awk '{r=r $0 ORS} (NR%4)==0{if (!/Pentium 4/) printf "%s", r; r=""}' file
1546c1546
<        inc      dword ptr [ebp-10H]
---
>        add      dword ptr [ebp-10H], 1
1552c1552
<        inc      esi
---
>        add      esi, 1