気の向くままに辿るIT/ICT/IoT
UNIX/Linuxコマンド

UNIX/Linuxコマンド pipe | パイプ

ホーム前へ次へ
UNIX/Linuxのパイプとは?

UNIX/Linuxコマンド pipe command | パイプ

UNIX/Linuxコマンド pipe command | パイプ

 UNIX/Linux及びシェルにおいて、パイプとは[ | ](縦棒)で表される処理結果を中継するコマンドです。

  |      ←れっきとしたコマンドでパイプ/パイプコマンドと呼ばれます。

 いくつかの例外はありますがコマンドライン上ではコマンドの実行は基本的に左から右に処理をしていきますが、パイプはまさにその際に左辺の結果を右辺に渡す役割をします。

$ foo | bar      ←fooの結果をbarで処理します。

 また、シェルはというかコマンドラインは、コマンドラインエディタでもあり、プチテキストエディタともいえるわけですが、かなり柔軟にコマンドラインから複数のコマンドを組み合わせたパイプラインによってあらゆるコマンドをワンライナーでもコマンドラインエディタ上で改行して記述することさえできますが、そのような場合にパイプが活躍します。

 例えばlsコマンドとmoreコマンドをパイプコマンドでつないだり、catコマンドとmoreコマンドをパイプコマンドで連結すれば、一画面に収まらないlsの結果やcatでの行数の多いファイルでも上から順番に閲覧して最終行まで順次閲覧することができ、パイプでmore/lessと連結する場合、ページを送る(進む)には[Enter]キー、終了するには[ q ]キーを押します。

$ ls -l | more 
 total 17 
 drwxr-xr-x+ 1 foo bar 4096  1192-10-10 10:00 ./
 drwxr-xr-x+ 1 foo bar 4096    645-11-11 09:00 ../
 -rwxr-xr-x   1 foo bar      8  1969-12-12 10:50 born_as_unix.sh
 -rwxr-xr-x   1 fao bar    10  1972-01-01 10:51 born_c_unix.sh
 -rwxr-xr-x   1 fbo bar    12  1987-02-02 10:52 born_perl.pl
 -rwxr-xr-x   1 fco bar    35  1991-03-03 10:53 born_linux_python.py
 -rwxr-xr-x   1 fdo bar    23  1995-04-04 10:54 born_ruby.rb
 -rw-r--r--  1 feo bar    86  2005-05-05 10:55 pipe_find_grep.txt
 ..... 
 --continue--(xx%)      

$ cat pipe_find_grep.txt | more 

 ↑ more pipe_find_grep.txt ってやればいいって話は内緒 

 それにしてもパイプって便利。 

 findの結果をパイプ経由でxargsに渡してgrepする時も使えるし。 

 -execとか-okもあるけど... 

 -execって環境によってlsやls -lしか引数に取れなかったり 

 受け取れるサイズに限界がある場合もあるらしい。 

 それでいて結果を一気に受け取るから件数多過ぎると失敗することも... 

 パイプ経由のxargsなら結果を分割して処理するから大丈夫らしいし。 

 find ../ -name "*" | xargs grep "pipe" 

 ..... 

 ちなみに↓日本語対応していれば[--続ける--(xx%)]になってるはず。

 --続ける--(xx%) 

 他の例としてはfindgrepした結果をawkで整形して画面に出力(標準出力)するという場合、grepとawkをパイプで連結すれば1回のコマンドで処理することができたりします。

 つまり、find/grepの結果を受け取ることができるように、パイプを介してawkコマンド[ find ... | xargs grep ... | awk ... ]を実行するということになります

 例えば、以下のようなテキストファイルがあるとして

$ cat test.txt 

 pipe is good command. 

 # ちなみにプレーンテキストなのになぜかコメントアウト風 

 以下のように記述して実行するとgrepでtest.txtからpipeという文字列が含まれる行を検索した結果がパイプ経由でawkに渡され、awkはこの場合スペース区切りで左から$1,$2...$nと特殊変数(位置変数パラメータ)に格納するので下記のように実行結果が出力されます。

$ grep "pipe" test.txt | awk ' { print $1 , $3 } ' 

pipe good 

 こうしてパイプで連結された一連のコマンド群はパイプラインと呼ばれます(他方ワンライナーと呼ばれることもあります)。

 更に[\]と打って[Enter]を押すとコマンド行の途中でも改行して複数行入力できるので下記のように記述して[Enter]を押すとコマンドが実行されて結果が表示されます。

$ find . -name "*.txt" | xargs grep "pipe" | awk ' BEGIN{ print \ 

> "Do you know good command ?\n" } { print $1 , $4 } \ 

> END{ print "\nSo good !!! Thanks!!" } ' 

Do you know good command ? 

pipe command. 

So good !!! Thanks!!

 改行するほど長くなるようなパイプラインにしてみたらawkコマンドのそれも中途半端なところで切れてしましたが、改行ができることを示すにはラッキーな展開となったので納得することにしました。

 ちなみに再帰的に検索するfindを使ってカレントディレクトリ[.]を起点に拡張子.txtというファイル名のファイルを探してパイプ経由でxargsに結果を渡すと逐一処理しながらgrepに入力ファイルとして1つずつ渡してくれるので、そのファイルの中からpipeという文字列を検索し、存在すれば、更にパイプ経由でawkに渡し、英文法があってるのかすらわからないけどBEGIN/ENDで素っ気ない反応でも喜ばれることもあるんだと思えるような会話風の小ネタを挟みつつ、スペース区切りの1番めと4番めの文字列を取り出して表示したのが「pipe」と「command」です。

LINK

ホーム前へ次へ