パイプ活用:実践的なコマンド連携

パイプ活用 とは

パイプを使って、複数のコマンドを連携させる実践的なテクニックを解説します。本レッスンでは、パイプ活用 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

ここまで学んだ grep / sed / awk / sort / uniq / wc などは、それぞれ単独でも便利ですが、パイプでつなぐことで真価を発揮します。ログ調査、データ集計、CSV のクレンジング、コードベースのリファクタリングなど、現場の作業はほとんどが「複数コマンドの組み合わせ」で進みます。

このレッスンでは、よく使う組み合わせパターンをいくつか紹介し、最後に簡単な集計を演習で体験します。

よく使う部品

コマンド役割
sort行をソートする (-n 数値、-r 逆順、-k 列指定)
uniq連続する重複を 1 つに、-c で件数を付ける
wc行数 (-l)、語数 (-w)、バイト数 (-c) を数える
cut区切りに基づき列を取り出す (-d 区切り、-f 列番号)
head / tail先頭 / 末尾を取り出す (-n で行数)
tr文字を変換 / 削除 (tr a-z A-Z で大文字化)

動作の図解

diagram (will load when visible)

「抽出 → 整形 → 集計 → ランキング → 上位 N 件」という流れは、ログ解析の定番パターンです。

ランキング集計

単語の出現回数ランキングを作る例です。

ターミナル

$ echo -e "apple\nbanana\napple\ncherry\napple\nbanana" | sort | uniq -c | sort -nr 3 apple 2 banana 1 cherry

手順を分解すると次のようになります。

  1. sort で同じ語を隣接させる
  2. uniq -c で連続重複を「件数 + 語」に変換する
  3. sort -nr で件数の降順に並べ替える

uniq はあくまで「隣接する」重複しか見ないため、必ず先に sort するのが鉄則です。

アクセスログの集計

アクセスログから IP ごとのアクセス回数 TOP3 を出す例です。

ターミナル

$ cat access.log | awk '{ print $1 }' | sort | uniq -c | sort -nr | head -3 150 192.168.1.10 98 10.0.0.5 42 172.16.0.1

awk '{ print $1 }' で IP 列だけを抜き出し、定番の集計パイプラインを通しています。同じパターンで「ステータスコードのランキング」「リクエストパスのランキング」など、さまざまな切り口の集計を組めます。

大きなファイルでは cat file | grep ... ではなく grep ... file の方が無駄なプロセスが減ります。とはいえ「読みやすさ優先で cat から始める」流派もあるので、チームの好みに合わせるとよいでしょう。

CSV の集計

スペース区切りでなく , 区切りの場合、-F, を使います。

ターミナル

$ echo -e "alice,30\nbob,25\ncarol,28" | awk -F, '{ sum += $2 } END { print sum }' 83

行数カウントとフィルタの組み合わせ

ファイル内のキーワード出現行数だけ知りたい場合は次のように書きます。

ターミナル

$ grep -c ERROR /tmp/app.log 23

複数ファイルにまたがって調べたいときは grep -c ERROR /var/log/*.log のように展開します。

文字変換のひと工夫

tr を使うと、改行や大文字小文字を変換できます。

ターミナル

$ echo "hello world" | tr ' ' '\n' hello world

スペース区切りを改行区切りに変えてから sort | uniq -c に流すと、英文の単語頻度を簡単に数えられます。

パイプライン処理は左から右に読み下せるため、コメントを書かなくても「何をやっているか」が読み取りやすいのが長所です。複雑になりすぎたら、シェルスクリプトに切り出し、変数や関数で意味を補うのがおすすめです。

やってみよう

演習では echo で複数の単語を出力し、ランキング集計のパイプラインを組み立てます。sortuniq -csort -nr の流れを覚えてください。

大文字小文字をそろえてカウント

単語頻度を測るとき、Appleapple を別物と数えてしまうと意図に合わないことがあります。tr で小文字に揃えてから数えるのが定番です。

ターミナル

$ echo -e "Apple\napple\nBANANA\nbanana" | tr 'A-Z' 'a-z' | sort | uniq -c 2 apple 2 banana

ヘッダー付き CSV の集計

CSV ファイルはたいてい 1 行目が見出し行です。awkNR > 1 で見出しをスキップしながら集計できます。

ターミナル

$ cat sales.csv | awk -F, 'NR > 1 { sum += $3 } END { print sum }'

まとめ

  • grep / awk / sort / uniq / head をつなぐと多くの集計ができる
  • ランキングは sort → uniq -c → sort -nr の順が定番
  • CSV は awk -F,、TSV は awk -F$'\t' で読める
  • 大文字小文字をそろえるには tr で前処理
  • パイプラインが長くなったらスクリプトに切り出し、可読性を保つ

次のレッスン

次は テキスト処理チェック で、パイプを使って、複数のコマンドを連携させる実践的なテクニックを解説します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. パイプライン実践 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. パイプライン実践 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo で単語リストを作る
  2. sort | uniq -c | sort -nr の順で集計
  3. awk '{ print $1, $2 }' で整形

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力