最近覚えたxargsの便利な使い方

xargs、標準入力から渡されたファイル名などを引数として、別のコマンドを実行する際に利用するものです。

例えば、*.logというファイルをfindコマンドで引っ張ってきて、そのファイル名にたいして ls -l を実行する場合はこんな感じ。

find ./ -name *.log | xargs ls -l

とまぁ、ここまではいままでも普通に使っていたんですが、xargsで引き渡したファイル名(文字列)をgrepの検索文字列として利用したいというケースがあった。

上記と同じ内容とすると、findコマンドで取得した*.logを検索文字列として、別のファイル(sample.txtとする)の中からそれをgrepしたいというわけです。*.logファイルに対して、同一の検索文字列を利用してgrepするというのは下記で当然できるのですが、xargsで引き渡すと最後の引数としてしか利用できないので、やりたいことが上手くできない。

find ./ -name *.log  | xargs grep 20110427

これだと、grepする対象のファイル名としてxargsで引き渡すされたファイル名が利用される

やりたことは以下。

find ./ -name *.log 

にて取得した hostA.log、hostB.log、hostC.log というファイルがあるとする。

これらを検索文字列として

grep hostA.log sample.txt
grep hostB.log sample.txt
grep hostC.log sample.txt

としたいので、xargsで引き渡す引数を、ファイル名ではなく、grep の 検索文字列として利用したいわけ。

で、結論から言うと、下記の xargs -I オプションを使えば、grepコマンドの検索文字列として引数を渡せるみたい。

 find ./ -name *.log  | xargs -I 'STRINGS'  grep 'STRINGS' sample.txt

'STRINGS'は何でもいいんだけど、わかりやすくするために。

xatgs -I オプションで 'STRINGS' と指定して、別のコマンドの引数として利用したい箇所に'STRINGS'を入れてあげれば、好きな場所に引数として利用できる。

案外、常識なのかもしれないけど、ぼくにとっては目からウロコの便利な使い方でした。