2013年5月1日水曜日

「逆grep」は素晴らしい。大量のゴミテキストデータの中から宝を探すことができる。

例えばこのように、あるディレクトリとあるディレクトリで差分を取ってテキストデータを作る。

# diff -rq dir1 dir2 > diff.txt

すると、大抵ゴミの行(無視していい行)だらけになる。例えば「.DS_Store」を含む行とか、「._」を含む行とか。

それをいちいち目で見て判断するのは人間がやることではないので、何とか機械的に出来ないだろうか?と考えた。

そこでこうしてやった。

# cat diff.txt | grep -v '\.DS_Store' | grep -v '\._' > diff_filtered.txt

ポイントはgrepの-vオプションだ。これは「--invert-match」の意味で、grepに逆の動作をさせることができるようになる。

つまり、「-v '\.DS_Store'」は「.DS_Storeを含まない行を出力せよ」となる。

このようにして複数キーワードを逆grepしつつパイプでつないでやると、最終的に欲しい行のみのテキストデータが出来上がる。

いやあ、UNIXって素晴らしい。