2016-08-17 1 views
1

2つの非常に大きなアセンブリダンプでdiffのコマンドを実行しています。私はこのような出力の多くを参照してください。Grep:行に不要な文字列が含まれている場合、前後の行を除外する方法は?

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 

は、私は本当に「ペンティアム4」または「一般的なX86のCPU」を含む行を表示したくありません。具体的には、 "Pentium 4"を含む行がある場合、その行とその上の3行を除外したい。

grepを使用してこれを行うことはできますか?私はgrep -v 'Pentium 4'について知っていますが、これは1行でしか動作しません。 grep -v -- '---'を実行することはできません。なぜなら、トリプルダッシュを含む有効な差分があるからです。

grepのクエリは、上記のコードで実行した場合、結果は

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

答えて

4

私はここで、プロセス置換が好き。のは、file_aを想定してみましょうです:

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

そしてfile_bは次のとおりです。

diff -I "^;" file_a file_b 

を実行

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

が返されます:

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

あなたは差分から特定のパターンと一致する行を除外するためにdiff-Iオプションを使用することができますする必要があります:

diff -I 'Pentium 4\|generic X86 CPU' file1 file2 

パターンは両方の行で一致する必要があります。そのため、|(論理または)演算子を使用してパターンを元のパターンと一致させる必要があります。

1

あなたは、ソースファイルからコメントを取り除くためにbashにプロセス置換を使用することができます。

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

行は実際にコメントしていることを良いキャッチ!しかし、私は 'diff -I '^の利点を見ていない。 file1 file2'と入力します。 – hek2mgl

+0

@ hek2mgl nevermind - 太い指が打ち込まれる前に入力してください...私は 'diff -I '^;' ...ビット、しかし私はあなたが私にそれを打つのを見る...そして、この特定のケースでは、 'diff -I'ルートは明らかに効率的であり、上記の場合には十分です。しかし、無視パターンを指定するのが簡単ではない複雑な状況があるかもしれないので、私は代替ツールとしてプロセス置換レシピを提案しました... – twalberg

+0

:) diff {(cmd1) <(cmd2) 'は私の人生を変えました! (本当に) – hek2mgl

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 
+0

この回答は低品質とフラグされています。それが質問に答える場合は、それがどのように機能するかを説明するテキストを少し追加することを検討してください。 – lmo

+0

いいえ、それはまったく必要ありません。あなたは、フラグを立てた答えにフラグを立てるツールをラバースタンプしない** ** **レビューすることになっています。これに返信しないで、私たちの時間を無駄にしないようにしてください。 –

+0

答えが技術的に正しい場合であっても、いくつかの説明を追加するといいでしょう。あなたはEdとは思わないのですか? –

関連する問題