最近覚えた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'を入れてあげれば、好きな場所に引数として利用できる。
案外、常識なのかもしれないけど、ぼくにとっては目からウロコの便利な使い方でした。