grep結果をファイル名と行番号だけに

grepで遊びます。

ファイル名と行番号だけのgrepリストを作り、そのリストから該当箇所を抽出します。

元ファイルは、いつもの英単語リスト使います。

takk@deb9:~/tmp$ shuf /usr/share/dict/words | head -1000 | split -dl100
takk@deb9:~/tmp$ ls
x00  x01  x02  x03  x04  x05  x06  x07  x08  x09
takk@deb9:~/tmp$ 

こうすると、ファイルx00~x09にランダムな英単語が100個できます。適当な単語を指定してgrep。

takk@deb9:~/tmp$ grep ^app *
x02:applesauce's
x03:appeaser
takk@deb9:~/tmp$ 

オプションつけないと、ファイル名と見つかった行が表示されますね。
-nオプションで行番号。

takk@deb9:~/tmp$ grep -n rr *
x00:40:parrakeet
x00:72:barraged
x00:87:parrakeets
x01:25:irritatingly
x01:32:deterring
x01:36:borrowed
x02:27:irresistible
x02:60:surrounds
x02:92:harried
x04:17:Barr's
x05:11:guerrilla's
x05:16:Lorraine's
x05:23:irregularity's
x05:60:surrealism's
x05:87:Corrine
x06:52:diarrhoea's
x07:14:scarred
x09:16:stirrer's
x09:57:barren
x09:87:Barrie's
takk@deb9:~/tmp$ 

ファイル名と行番号だけにするため、cutでcut。

takk@deb9:~/tmp$ grep -n rr * | cut -d: -f1,2 | tee list
x00:40
x00:72
x00:87
x01:25
x01:32
x01:36
x02:27
x02:60
x02:92
x04:17
x05:11
x05:16
x05:23
x05:60
x05:87
x06:52
x07:14
x09:16
x09:57
x09:87
takk@deb9:~/tmp$ 

ファイル名と行番号のリストされたlistファイルを作成しました。

次はこのlistファイルのファイル名、行番号の一覧から、該当行を抽出。

takk@deb9:~/tmp$ perl -ne 'chomp; ($file,$no)=split /:/,$_;$cmd= "sed -ne " . $no . "p " . $file;system($cmd)' list
parrakeet
barraged
parrakeets
irritatingly
deterring
borrowed
irresistible
surrounds
harried
Barr's
guerrilla's
Lorraine's
irregularity's
surrealism's
Corrine
diarrhoea's
scarred
stirrer's
barren
Barrie's
takk@deb9:~/tmp$ 

思い通りにテキスト整形できると、日常のお仕事はものすごくはかどります。
でも、あまりきれいではないコマンド連携。簡潔なワンライナー書けるようになるのはいつの日か。

コメント

タイトルとURLをコピーしました