
Unix / Linux – パイプとフィルタ
この章では、Unixのパイプとフィルタについて詳しく説明します。あるプログラムからの出力が次のプログラムの入力となるように、2つのコマンドを一緒に接続することができます。
このように接続された2つ以上のコマンドを使う場合パイプ ( | ) を使います
パイプを作成するには、コマンドラインに2つのコマンドの間に縦線( | )を付けます。
プログラムが別のプログラムから入力を受け取ると、その入力に対して何らかの操作を実行し、その結果を標準出力に書き込むことができます。
grepコマンド
grepコマンドは、ファイルを検索して特定のパターンを持つ行を探します。構文は次のとおりです。
$grep pattern file(s)
“grep”という名前は、“正規表現をグローバルに検索しそれを含むすべての行を表示する”という意味のed(Unix行エディタ)コマンドg / re / pから来ます。
正規表現は、プレーンテキスト(たとえば単語)やパターンマッチングに使用される特殊文字のいずれかをさします。
grepの基本的な使い方は、単一の単語からなるパターンを探すことです。
指定された文字列を含む入力ファイルの行だけが標準出力に送られるようにパイプで使用できます。
grepに読み込むファイル名を与えないと、標準入力が読み込まれます。それはすべてのフィルタプログラムが動作する方法です –
$ls -l | grep "Aug" -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
grepコマンドと一緒に使用できるさまざまなオプションがあります。
S.No. | オプションと説明 |
---|---|
1 | -v
patternと一致しないすべての行を出力します。 |
2 | -n
一致した行とその行番号を出力します。 |
3 | -l
一致する行(文字 “l”)のファイル名のみを出力します。 |
4 | -c
一致する行の数だけを出力します。 |
5 | -私
大文字または小文字のいずれかに一致します。 |
grepに“carol”という行とそれに続く正規表現で “。*”と略記されたゼロまたはその他の文字が続いて “Aug”が続く行を見つける正規表現を使用しましょう。
ここでは、大文字と小文字を区別しない検索を行うために-iオプションを使用しています。
$ls -l | grep -i "carol.*aug" -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros $
sortコマンド
ソートコマンドは、アルファベット順または数値的にテキストの行を配置します。次の例では、フードファイルの行をソートします。
$sort food Afghani Cuisine Bangkok Wok Big Apple Deli Isle of Java Mandalay Sushi and Sashimi Sweet Tooth Tio Pepe's Peppers $
ソートコマンドは、デフォルトではアルファベット順にテキストの行を配置します。並べ替えを制御する多くのオプションがあります。
S.No. | 説明 |
---|---|
1 | -n
数値でソートします(例:10は2より後にソートされます)。空白とタブは無視されます。 |
2 | -r
並べ替えの順序を逆にします。 |
3 | -f
大文字と小文字を並べ替えます。 |
4 | + x
並べ替えるときに最初のxフィールドを無視します。 |
わかりずらいので以下のように並べ替えて見ましょう。
以下のパイプは、コマンドのから成りLS、grepを、およびソート - を行なっている状態です
$ls -l | grep "Aug" | sort +4n -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-rw- 1 john doc 11008 Aug 6 14:10 ch02 $
このパイプは、8月に変更されたディレクトリ内のすべてのファイルをサイズ順にソートし、ターミナル画面に表示します。ソートオプション+ 4nは4つのフィールドをスキップします(フィールドは空白で区切られます)。その後、数値順にソートされます。
pgとmoreコマンド
通常、長い出力は画面上で圧縮されますが、moreを介してテキストを実行するか、またはpgコマンドをフィルタとして使用すると、画面がテキストでいっぱいになると表示が停止します。
ディレクトリリストが長いと仮定しましょう。並べ替えられたリストを読みやすくするために、次のように出力をさらにパイプします。
$ls -l | grep "Aug" | sort +4n | more -rw-rw-r-- 1 carol doc 1605 Aug 23 07:35 macros -rw-rw-r-- 1 john doc 2488 Aug 15 10:51 intro -rw-rw-rw- 1 john doc 8515 Aug 6 15:30 ch07 -rw-rw-r-- 1 john doc 14827 Aug 9 12:40 ch03 . . . -rw-rw-rw- 1 john doc 16867 Aug 6 15:56 ch05 --More--(74%)
画面には、ファイルサイズの順にソートされた行で構成されるテキストがいっぱいになると、画面がいっぱいになります。画面の下部には、よりプロンプトが表示されます。ここで、ソートされたテキストを移動するコマンドを入力できます。
この画面が終了したら、詳細プログラムの説明に記載されているコマンドを使用できます。