goo blog サービス終了のお知らせ 

gooブログはじめました!

LinuC/LPIC にも役立つ! 基礎からわかる Linuxコマンド。

〇 Linuxコマンドの実行結果を別のコマンドに渡す、「パイプ」の使い方。

今回で紹介するコマンドと書式
画2、今回で紹介するコマンドと書式。

実行結果を別のコマンドに渡す「パイプ」。

シェルに用意された「パイプ」という機能を使うと、あるコマンドの標準出力を別のコマンドの標準入力に接続できます。文字通り水道管のパイプのようなイメージで、コマンドの実行結果を別のコマンドに受け渡して処理できるわけです(図3)。パイプの記号には「|」を使用します。LinuxなどUNIX系コマンドの多くはシンプルな機能のものが少なくありません。それらをパイプで組み合わせて処理することにより、複雑な処理が可能になります。

図3 「パイプ(|)」で実行結果を次のコマンドに受け渡せる
図3 「パイプ(|)」で実行結果を次のコマンドに受け渡せる。

less。

「less」は「ページャ」と呼ばれる種類のコマンドで、引数で指定したファイルをページ単位で(1画面ずつ)表示します。次のコマンドでは、「/etc/services」ファイル*1の内容をページ単位で表示します(図4)。

$ less /etc/services⏎
*1 ネットワークのサービス名と、ポート番号とプロトコルの対応関係を記述したファイル。
 
図4 「less /etc/services⏎」を実行した直後の画面
図4、「less /etc/services⏎」を実行した直後の画面。

次のページに進むにはスペースキーを、前のページに戻るには[B]キーを、終了するには[Q]キーを押します。lessコマンドは、別のコマンドが出力した大量の結果を1ページずつ確認したいときに便利です。ここで「/etc」ディレクトリー*2内を「ls -l」コマンドで一覧表示したいとしましょう。/etcディレクトリーには大量のファイルが保存されているので、単純に「ls -l /etc⏎」と実行すると一覧の最初の方が、端末画面をスクロールしないと見ることができません。次のように「ls -l /etc」の結果をパイプでlessコマンドに渡すことにより、一覧をページ単位で参照できるようになります(図5)。

$ ls -l /etc | less⏎
*2 さまざまな設定ファイルが保存されているディレクトリー。
 
図5 「ls -l /etc | less⏎」を実行した直後の画面
図5、「ls -l /etc | less⏎」を実行した直後の画面。

lessコマンドには、文字列の検索機能が用意されています。「/」を入力すると画面最下部に「/」が表示されるので、続けて検索したい文字列を入力して[Enter]キーを押します。後方に向かって検索が実行され、見つかった文字列がハイライト表示されます(図6)。同じ文字列を続けて後方検索したいときは小文字の「n」を、逆に前方検索したいときは大文字の「N」を入力([Shift]キーを押しながら[N]キーを押す)します。「/」の代わりに「?」を入力すると、前方に向かって検索できます。

図6 lessコマンドの実行結果で「init」をキーワード検索したときの画面
図6、lessコマンドの実行結果で「init」をキーワード検索したときの画面。

lessコマンドには、ほかにもさまざまなキー操作が用意されています。[H]キーを押すとヘルプを参照できます(図7)。

図7 lessコマンドの実行結果で「h」を入力してヘルプを表示したときの画面
図7、lessコマンドの実行結果で「h」を入力してヘルプを表示したときの画面。

head。

「head」は、ファイルの最初の部分を表示するコマンドです。「-n 行数」オプションで行数を指定します。行数の指定を省いたときは「10行」が自動的に指定されます。headコマンドをパイプで「cat -n」コマンドと組み合わせると、指定したファイルの最初の部分を行番号付きで表示できます。図8の実行例では「/etc/services」ファイルの最初の5行が行番号付きで表示されます。

図8 「head」コマンドの実行結果
図8、「head」コマンドの実行結果。

tail。

「tail」コマンドはheadコマンドとは逆にファイルの最後の部分を表示します。図9の実行例では「/etc/services」ファイルの最後の5行を行番号付きで表示します。

図9 「tail」コマンドの実行結果
図9、「tail」コマンドの実行結果。

パイプでは三つ以上のコマンドを接続できます。例えば「/etc/services」ファイルの96~100行目までを行番号付きで表示するには、catコマンドの結果にheadコマンドとtailコマンドを接続し、図10のように実行します。

図10 冒頭100件を出力する「head」コマンドと末尾5件を出力する「tail」コマンドをパイプでつないだときの実行結果
図10、冒頭100件を出力する「head」コマンドと末尾5件を出力する「tail」コマンドをパイプでつないだときの実行結果。

nl。

「nl」はファイルを行番号付きで表示するコマンドです。「cat -n⏎」でも行番号を表示できますが、nlコマンドはより細かく設定できます。図10のコマンドは、nlコマンドを使うと図11のように置き換えられます。「-w4」オプションで行番号を4桁で表示し、「-nrz」オプションで前方を「0」で埋めています。

図11 「nl」コマンドで行番号の表示形式をカスタマイズしたときの実行結果
図11、「nl」コマンドで行番号の表示形式をカスタマイズしたときの実行結果。

cut

「cut」は、各行に同じ形式でデータが記述されたテキストファイルから必要な項目を取り出すコマンドです。cutコマンドでは「-d "区切り文字"」オプションで区切り文字を指定し、「-f 番号」で何番目の項目を取り出すのかを指定します(先頭の項目を「1」とします)。例えば各行に「番号:名前:年齢:性別」が記述された次のようなテキストファイル「customers.txt」があるとします。

1:大津真:39:男性
2:田中一郎:40:男性
3:伊藤花子:14:女性
4:石田あゆみ:34:女性

このcustomers.txtファイルから名前だけを取り出して表示するには次のように実行します。

$ cut -d ":" -f 2 customers.txt⏎
大津真
田中一郎
伊藤花子
石田あゆみ

「-f」オプションを「-f 番号1,番号2」の形式で指定すると、番号1から番号2までの範囲の項目を取り出せます。また、結果をファイルに書き出したいときはリダイレクションを使います。例えば、先ほどのcustomers.txtファイルから名前と年齢を取り出し、テキストファイル「names.txt」に書き出すには、次のように実行します。

$ cut -d ":" -f 2,3 customers.txt > names.txt⏎

catコマンドでnames.txtファイルの内容を確認してみましょう。

$ cat names.txt⏎
大津真:39
田中一郎:40
伊藤花子:14
石田あゆみ:34


ランキングに参加中。クリックして応援お願いします!

名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「〝 たぬき の 「 スマホ ・ パソコン 」 ワールド 〟」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事