パイプの構成要素として 様々なコマンドがあり、
フィルターとして動作する。
情報の選別
head, tail grep cut, awk uniq
変形を伴うフィルター
sort sed tr awk ~ perl ruby python
最終段に使うコマンド
more, less wc
yes から出発してみる。
yes
# Ctrl-C で止めて下さい
yes | head -15
yes " " | head -15 # 数値(行数)15は適当な値
yes " " | head -15 | nl # head -15 と nl は 入れ替えてもいい
yes "" | head -15 | nl # nl はデフォルトでは空行はスキップする
yes "" | head -15 | nl -ba
それぞれのコマンド(と引数)の意味を確認しながら実行してみて下さい。
さらに、
yes "" | nl -ba | grep '3' | head -15 # 3のある行
yes "" | nl -ba | grep '3$' | head -15 # 1の位が3である行($はあとで解説)
yes "" | nl -ba | tail -n +100 | head -15 # 上と下からカット(行範囲指定)
yes "" | nl -ba | tail -n +100 | head -1 # 指定した行だけ
GREP <- Global Regular Expression Print
なお、yes | tail
という繋ぎ方の、単純なパイプラインは、
(Ctrl-Cで割り込まない限り)永遠に終了しない
(tailは入力の終了を検出しないと動作しない)ので注意。
yes | wc
も同様。
他に、sort など集計的な機能を持つコマンドでも同じ。
一般的に言えば、パイプでつないだ複数のコマンド群は、 右図(上)のように前段または後段のいずれかが処理終了 (或はパイプへの書きこみや読み込みを終了)すれば 互いに道連れになって終了する。
yesは自ら終了しない
tail は前段が終了しないと(標準出力への)出力を開始しない
そのため head も読み込むデータがないまま待ち状態を(果てしなく)続けてしまう。
という動作になるようだ。
ls | cat | cat | cat # 全透過フィルターはいくつ重ねても同じ
ls | tac # cat を逆さまにした名前
ls | rev # REVerse
ls -l | awk '{print $1}'
ls -l | awk '{print $9}'
ps x | awk '{print $8}'
ps x | awk '{print $8}' | tail -n +1
ps x | awk '{print $8}' | sed '1d'
ls -F | sed '/\//d'
ls -l | awk '{print $9,$1}'
awk <- Aho Weinberger Kernighan (それぞれ人名)
sed <- Stream EDitor
od -x
などのコマンドで、出力を仔細に(文字コードを表示させて)
チェックしたり、wc
コマンドで、その行数をカウントすることもできる。(別ページの実演例も参考にして下さい。)