〇 Linuxコマンドの実行結果を別のコマンドに渡す、「パイプ」の使い方。
実行結果を別のコマンドに渡す「パイプ」。
シェルに用意された「パイプ」という機能を使うと、あるコマンドの標準出力を別のコマンドの標準入力に接続できます。文字通り水道管のパイプのようなイメージで、コマンドの実行結果を別のコマンドに受け渡して処理できるわけです(図3)。パイプの記号には「|」を使用します。LinuxなどUNIX系コマンドの多くはシンプルな機能のものが少なくありません。それらをパイプで組み合わせて処理することにより、複雑な処理が可能になります。
less。
「less」は「ページャ」と呼ばれる種類のコマンドで、引数で指定したファイルをページ単位で(1画面ずつ)表示します。次のコマンドでは、「/etc/services」ファイル*1の内容をページ単位で表示します(図4)。
次のページに進むにはスペースキーを、前のページに戻るには[B]キーを、終了するには[Q]キーを押します。lessコマンドは、別のコマンドが出力した大量の結果を1ページずつ確認したいときに便利です。ここで「/etc」ディレクトリー*2内を「ls -l」コマンドで一覧表示したいとしましょう。/etcディレクトリーには大量のファイルが保存されているので、単純に「ls -l /etc⏎」と実行すると一覧の最初の方が、端末画面をスクロールしないと見ることができません。次のように「ls -l /etc」の結果をパイプでlessコマンドに渡すことにより、一覧をページ単位で参照できるようになります(図5)。
lessコマンドには、文字列の検索機能が用意されています。「/」を入力すると画面最下部に「/」が表示されるので、続けて検索したい文字列を入力して[Enter]キーを押します。後方に向かって検索が実行され、見つかった文字列がハイライト表示されます(図6)。同じ文字列を続けて後方検索したいときは小文字の「n」を、逆に前方検索したいときは大文字の「N」を入力([Shift]キーを押しながら[N]キーを押す)します。「/」の代わりに「?」を入力すると、前方に向かって検索できます。
lessコマンドには、ほかにもさまざまなキー操作が用意されています。[H]キーを押すとヘルプを参照できます(図7)。
head。
「head」は、ファイルの最初の部分を表示するコマンドです。「-n 行数」オプションで行数を指定します。行数の指定を省いたときは「10行」が自動的に指定されます。headコマンドをパイプで「cat -n」コマンドと組み合わせると、指定したファイルの最初の部分を行番号付きで表示できます。図8の実行例では「/etc/services」ファイルの最初の5行が行番号付きで表示されます。
tail。
「tail」コマンドはheadコマンドとは逆にファイルの最後の部分を表示します。図9の実行例では「/etc/services」ファイルの最後の5行を行番号付きで表示します。
パイプでは三つ以上のコマンドを接続できます。例えば「/etc/services」ファイルの96~100行目までを行番号付きで表示するには、catコマンドの結果にheadコマンドとtailコマンドを接続し、図10のように実行します。
nl。
「nl」はファイルを行番号付きで表示するコマンドです。「cat -n⏎」でも行番号を表示できますが、nlコマンドはより細かく設定できます。図10のコマンドは、nlコマンドを使うと図11のように置き換えられます。「-w4」オプションで行番号を4桁で表示し、「-nrz」オプションで前方を「0」で埋めています。
cut
「cut」は、各行に同じ形式でデータが記述されたテキストファイルから必要な項目を取り出すコマンドです。cutコマンドでは「-d "区切り文字"」オプションで区切り文字を指定し、「-f 番号」で何番目の項目を取り出すのかを指定します(先頭の項目を「1」とします)。例えば各行に「番号:名前:年齢:性別」が記述された次のようなテキストファイル「customers.txt」があるとします。
2:田中一郎:40:男性
3:伊藤花子:14:女性
4:石田あゆみ:34:女性
このcustomers.txtファイルから名前だけを取り出して表示するには次のように実行します。
大津真
田中一郎
伊藤花子
石田あゆみ
「-f」オプションを「-f 番号1,番号2」の形式で指定すると、番号1から番号2までの範囲の項目を取り出せます。また、結果をファイルに書き出したいときはリダイレクションを使います。例えば、先ほどのcustomers.txtファイルから名前と年齢を取り出し、テキストファイル「names.txt」に書き出すには、次のように実行します。
catコマンドでnames.txtファイルの内容を確認してみましょう。
$ cat names.txt⏎
大津真:39
田中一郎:40
伊藤花子:14
石田あゆみ:34
。