xargs についてのメモ

xargs の使い方毎回忘れるので、備忘。

xargs の一般的な話は他で。

実行されるコマンドだけを列挙

xargs を利用した際に発行されるコマンドだけを列挙させるには、 -p オプションを使って、

cut -f 5 data2|tail -10|xargs -n 1 -I {} -p ./bcrypt.mac --password={}
./bcrypt.mac --password=kdsjfkldsjfkdsj?...
./bcrypt.mac --password=kdsfjdkfjkd?...

のようにする。で、実行させる場合、-p オプションを除去して、

cut -f 5 data2|tail -10|xargs -n 1 -I {} ./bcrypt.mac --password={}
$2a$10$VEA5caueTtvClPJvX3zdXuONc32pPGlPGEstkbxmpFnWIWH40WGau
$2a$10$bkPOHB3laLV9rnxERIaeneYKfDog28yPx0TilZZusedPGdbfSrH2W

のようにする。上記の例だと、bcrypt.mac コマンドの実行結果だけが出ている。

コマンド呼び出し頻度の変更

何も指定しない場合、

cut -f 5 data2|tail | xargs echo
kasjfd asdfkjfdfd sdkfjdkfjd 

こういう感じ。どうしてこうなるかというと、

cut -f 5 data2|tail | xargs -p echo
echo kasjfd asdfkjfdfd sdkfjdkfjd?...

のように処理されるから。もっと量が多い場合は、echo が2回以上呼ばれる場合もある。

毎回 echo を呼びたい場合、

cut -f 5 data2|tail | xargs -p -n 1 echo
echo kdsjfkeiasdfdaf?...
echo akksjfkdfjdkjf?...
echo kjfkdfjdkfdf?...

とする。

引数の場所を指定する

上記までのやり方だと引数は常に最後につく。場所を find コマンドのように指定したい場合、

cut -f 5 data2|tail -10|xargs -n 1 -I {} -p ./bcrypt.mac --password={}
./bcrypt.mac --password=ksjfkdjdkfj?...
./bcrypt.mac --password=kdjfdkjfdkjfd?...
./bcrypt.mac --password=kjfdkjfdkddd?...

のようにする。

さらに凝ったことがやりたい時は

Perl とかのスクリプト言語でやったほうが簡単な場合も。

cut -f 5 data2|tail -10|perl -nle '$a=`./bcrypt.mac --password=$_`;chomp($a);print "$_:$a"'
asfdsfd:$2a$10$q9B5Nthx7AqliBzY7vQdruekrDNHbw6HyVlpH9JcyjIO2Cn5.ITVq
asfdsfdfd:$2a$10$6p7SKXrJ3M.s8Z/r4u7rwe66gIyAZri3pdDz8dpex3EyrcbfpZpu6
asdfdsfdsdd:$2a$10$6Q4wlJkINHxjJAKg6ztOOOE1.vUZcqN7b2h6ZQ9DTK7NwATGmj18q
cut -f 2,5 data2|tail -10|perl -nle 'chomp;@a=split;$b=`./bcrypt.mac --password=$a[1]`;chomp($b);print "$a[0]:$a[1]:$b"'
Aさん:mcvcivc:$2a$10$x84wWkAVyFO2ppjM1ltTau9rI7XViUkbjldqhxlb6UCo99ctnyAKW
Bさん:jckjfeiedf:$2a$10$KSz0GIl5whWhRs2e9sS9AOt7DkrJOHB9lJ6iFbdgWMz2iLyxbQl3i
Cさん:kdfjkfjeij:$2a$10$xwqZpX3nJhldceSx05J78OzdLVnT0BSPp7J9xfFNYS0DHpteGQo/C

以上