一時ファイル作成が不要になる「プロセス置換」
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に切り替えてから使ってください。
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法