TopLinux > 2014年5月
2014年5月 9日

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

May 9,2014 1:33 AM
Tag:[, ]
Permalink

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に切り替えてから使ってください。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3