こんばんは、ころすけ(@wg_koro)です。
最近、bashの「プロセス置換」が面白いなぁ、とよく遊んでます。
プロセス置換とは
コマンドの結果をファイルとして扱ったり、出力先をコマンドとして扱ったりできます。
参考:漢のzsh (12) 一時ファイルはもういらない – プロセス置換 | マイナビニュース
まぁもっぱら便利なのは前者。こいつが非情に便利。例えば、下記のようなテキスト(list.csv)があったとして。
[text title=”list.csv”]
id1,あべし
id2,ぶべらっ
id3,ぽぅ
[/text]
id1,あべし
id2,ぶべらっ
id3,ぽぅ
[/text]
1列目の「idXX」で target.txt を検索したいとします。
[text title=”target.txt”]
20130909,2055,id1
20130909,1932,id1
20130909,1811,id4
[/text]
20130909,2055,id1
20130909,1932,id1
20130909,1811,id4
[/text]
まぁ…この程度ならやりようは色々あると思いますが、これをプロセス置換を使って解いてみます。
[text]
grep -f <(cut -d, f1 list.csv) target.txt
grep -f <(cut -d, f1 list.csv) target.txt
出力結果:
20130909,2055,id1
20130909,1932,id1
[/text]
「<()」で囲った部分がプロセス置換です。「cut -d, -f1 list.csv」の結果をファイルとして利用してくれるんですね。一時ファイルが不要なので超便利。
スクリプトの中から使ってみたい
さて、こいつをスクリプト(PHP, Perl)の中から使ってみようと思ったら動かない。あれー?とりあえずPHPで書いてみる。
[php]
$cmd = "grep -f <(cut -d, f1 list.csv) target.txt";
exec($cmd, $res, $return_val);
$cmd = "grep -f <(cut -d, f1 list.csv) target.txt";
exec($cmd, $res, $return_val);
var_dump($cmd);
var_dump($res);
var_dump($return_val);
[/php]
これを実行すると、$return_valが「2」となって正常に実行されない。はて。
…ああ、もしかして明示的にbash指定してやらないとダメなのか?
[php]
$cmd = ‘bash -c "grep -f <(cut -d, f1 list.csv) target.txt"’;
exec($cmd, $res, $return_val);
$cmd = ‘bash -c "grep -f <(cut -d, f1 list.csv) target.txt"’;
exec($cmd, $res, $return_val);
var_dump($cmd);
var_dump($res);
var_dump($return_val);
[/php]
実行結果
[text]
string(52) "bash -c "grep -f <(cut -d, -f1 list.csv) target.txt""
array(2) {
[0]=>
string(17) "20130909,2055,id1"
[1]=>
string(17) "20130909,1932,id1"
}
int(0)
[/text]
string(52) "bash -c "grep -f <(cut -d, -f1 list.csv) target.txt""
array(2) {
[0]=>
string(17) "20130909,2055,id1"
[1]=>
string(17) "20130909,1932,id1"
}
int(0)
[/text]
よしよし、ビンゴ。
スクリプトの中から使うことは滅多にないでしょうけど、場合によっては便利なので覚えておくといいかもです。