一時ファイル作成が不要になる「プロセス置換」

一時ファイル作成が不要になる「プロセス置換」

Posted at May 9,2014 1:33 AM
Tag:[bash, Linux]

LinuxやMacなどで一時ファイル作成が不要になる「プロセス置換」の使い方について紹介します。

プロセス置換

1.はじめに

2つのファイルを比較するときには、通常diffを利用します。

% diff foo.txt bar.txt

ですが、一方または両方のファイルを加工してから比較したい場合、次のようなことを行うことがあります。

% grep -v hoge foo.txt > foo2.txt
% grep -v hoge bar.txt > bar2.txt
% diff foo2.txt bar2.txt

具体的な例として、5月9日と5月10日のウェブサイトへのページ別アクセス数のログ(CSVファイル)があるとします(Google AnalyticsからダウンロードしたCSVとか)。

% cat 0509.log
aaa.html,300
bbb.html,20
ccc.html,156
ddd.html,8
eee.html,77
 
% cat 0510.log
aaa.html,378
ccc.html,32
ddd.html,96
eee.html,118
fff.html,234

この2つのファイルから2日間でアクセスのあったファイルの増減を知りたい場合、diffで2つのファイルを比較する方法があります。

が、このまま比較するとすべての行で差分として出力されてしまうので、まず次のように1つめのフィールド(ファイル名)だけを取得します。

% cut -d, -f1 0509.log > 0509_file.log
% cut -d, -f1 0510.logt > 0510_file.log
% cat 0509_file.log
aaa.html
bbb.html
ccc.html
ddd.html
eee.html
 
% cat 0510_file.log
aaa.html
ccc.html
ddd.html
eee.html
fff.html

そして0509_file.logと0510_file.logのdiffを取得することで、アクセスのあったファイルの増減が分かります。

% diff -u 0509_file.log 0510_file.log
--- 0509_file.log       2014-05-09 00:59:26.000000000 +0900
+++ 0510_file.log       2014-05-09 00:59:31.000000000 +0900
@@ -1,5 +1,5 @@
 aaa.html
-bbb.html
 ccc.html
 ddd.html
 eee.html
+fff.html

この場合、0509_file.logや0510_file.logは一時ファイルなのであとで削除する必要がありますが、ファイルを削除する手間がかかります。

本エントリーで紹介する「プロセス置換」を使えば、加工した結果を一時ファイルに出力する必要がなくなります。

2.プロセス置換で2つのファイルを比較する

1項のサンプルについて、プロセス置換を使って比較するには、次のようにします。

% diff -u <( cut -d, -f1 0509.txt ) <( cut -d, -f1 0510.txt )
--- /tmp//sh-np-27020063106062  2014-05-09 01:01:50.000000000 +0900
+++ /tmp//sh-np-54040921395456  2014-05-09 01:01:50.000000000 +0900
@@ -1,5 +1,5 @@
 aaa.html
-bbb.html
 ccc.html
 ddd.html
 eee.html
+fff.html

diffコマンドの後方に「<()」という記号をつけ、その中に一時加工したいコマンドを書きます。

% diff -u <( cut -d, -f1 0509.txt ) <( cut -d, -f1 0510.txt )

こうすることで、cutコマンドの実行結果をファイルのように扱えます。

3.プロセス置換とは

プロセス置換(Process Substitution)とは、一時ファイルまたは名前付きパイプなどを利用し、それをコマンドの引数として渡す仕組みのようです。

2項の実行結果にある、

--- /tmp//sh-np-27020063106062  2014-05-09 01:01:50.000000000 +0900
+++ /tmp//sh-np-54040921395456  2014-05-09 01:01:50.000000000 +0900

から、/tmp配下にファイルを出力していることが分かります。

プロセス置換には2つのフォーマットがあります。

コマンド <(list)

は前述のとおり、コマンドをファイルのように扱えます。

コマンド >(list)

とすれば、出力先をコマンドに渡すこともできます。

"<"または">"と"("の間にはスペースを入れてはいけません。

cshでは動作しないようなので、bashに切り替えてから使ってください。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)