KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

パイプとテキスト操作コマンドで爆発的に広がる「データ処理力」


GUIベースの操作に慣れていると、膨大なログやテキストデータの検索・整形・抽出は手間がかかるもん、って認識かもしれません。

ところが、Linuxの基本的なテキスト操作コマンド(grep, sed, sort, uniqなど)とパイプ(|)を組み合わせると、メッチャ多様なデータ処理を簡潔に記述できます。

この記事では、初心者の方にもわかるように、これらコマンドがどのように組み合わさるのか、そしてどんな場面で役に立つのかを分かりやすく解説することにトライします!


基本コマンドのおさらい

  • grep:文字列パターン(正規表現)にマッチする行を抽出するコマンド
  • sed:ストリームエディタ。行単位でテキストを編集・変換できる
  • sort:入力テキストを行単位でソート(並べ替え)する
  • uniq:重複行をまとめる、または重複行をカウントするなどの処理が可能

これらは1つ1つでも強力ですが、パイプで繋ぐことで「検索 → 加工 → 整形 → ソート → 重複削除」といった一連の流れを、1行のコマンドで実現できます。
パイプがポイントなんです。


よくある活用シナリオと例

シナリオ1:ログファイルから特定のエラーを抽出し、ユニークな発生元を特定する

/var/log/app.log というログファイルから、「ERROR」という単語を含む行を抽出し、その行に含まれる「IPアドレス」を取り出し、ユニークなIP一覧を表示するとします。

grep "ERROR" /var/log/app.log | \
sed -E 's/.*from ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/' | \
sort | \
uniq

ここでのポイント:

  • grep "ERROR":ERROR行を抽出
  • sed -E 's/.*from ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/':正規表現で行からIPアドレス部分だけを抜き出す
  • sort:IPアドレスを並べ替え
  • uniq:同一IPアドレスを1つにまとめる

結果として、「エラーを起こすユニークなIPの一覧」が得られます。

シナリオ2:設定ファイルから特定のキーのみを抜き出す

/etc/myapp/config.conf にキーバリュー形式で設定が大量に書かれているとします。db_userdb_hostの設定値だけを確認したい場合:

grep "^db_" /etc/myapp/config.conf | sort
  • grep "^db_":行頭がdb_で始まる行(DB関連の設定)を抽出
  • sort:キー名順に並べて表示することで、見やすく整理

さらに、コメント行や空行を除いて、キーと値を整形するにはsedを使います。

grep "^db_" /etc/myapp/config.conf | sed 's/^db_/DB_/g' | sort

この例では、db_DB_に置換して、視覚的に強調したり整理したりできます。

シナリオ3:Webアクセスログからアクセス傾向を分析

ApacheやNginxのアクセスログ(access.log)から、特定のページへのアクセス数やクライアントIPを分析してみます。

例1:特定ページへのアクセス回数を知りたい

grep "/myapp/page1" /var/log/nginx/access.log | wc -l

wc -lは行数カウントですが、このパターンは基本中の基本。
ここから発展させて、ユニークなIPアドレス数をカウントするには:

grep "/myapp/page1" /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq | wc -l

ここではawk '{print $1}'で1列目(IPアドレス)を抽出していますが、sedcutで同様の抽出が可能です。

例2:特定ユーザーエージェント別のアクセス回数

grep "Chrome" access.log | sort | uniq -c | sort -nr | head
  • grep "Chrome":Chromeブラウザでアクセスした行だけ
  • sort | uniq -c:同一行をまとめて、その出現回数(-c)を表示
  • sort -nr:出現回数が多い順に並び替え
  • head:上位10件を表示

もしログのフォーマットが複雑なら、sedを使って必要な部分だけ抜き出してから集計できます。

シナリオ4:テキストファイルから特定パターンで抽出・整形

たとえば、大量のメールアドレス一覧 emails.txt から、特定ドメインのメールだけを抽出し、ドメイン部分を置換したいとします。

grep "@example.com" emails.txt | \
sed 's/@example\.com/@newdomain.com/' | \
sort | uniq
  • grep "@example.com":特定ドメインのメールのみ抽出
  • sed 's/@example\.com/@newdomain.com/':ドメインを@newdomain.comへ変更
  • sort | uniq:結果をソートして重複を取り除く

これで、@example.com@newdomain.comに統一した、ユニークなメールアドレス一覧を一瞬で作成できます。

シナリオ5:システムコマンドと組み合わせて動的なレポート生成

ps auxで現在動いているプロセスを取得し、grepで特定のプロセスを絞り込んでuniqで重複を削除、sortでメモリ使用量順に並べる例を考えます。

ps aux | grep "python" | awk '{print $2, $4, $11}' | sort -k2nr | uniq

ここでは

  • ps aux:全プロセスを表示
  • grep "python":pythonを含むプロセスのみ抽出
  • awk '{print $2, $4, $11}':PID($2), %MEM($4), COMMAND($11)のみ抽出
  • sort -k2nr:2列目(%MEM)を数値として逆順ソート(メモリ使用量の多い順)
  • uniq:同一行の重複があればまとめる(※このケースではあまり重複はないかもですが、他の場面で有効)

これにより、「python関連のプロセスをメモリ使用量順で確認」するといったレポーティングがワンライナーで実現できます。


ヒント・テクニック

  1. 小さなパイプから始める
    最初はgrepsortuniqのような単純な流れから始めて、sedによる置換やawkによる列抽出を追加していく。
  2. 正規表現を駆使する
    grepsedの正規表現を使いこなせば、複雑なパターンマッチもシンプルなコマンドで可能になります。
  3. uniq -csort -nなどオプションの活用
    uniqには-c(出現回数を数える)があり、sortには-n(数値ソート)、-r(逆順ソート)があります。これらを組み合わせると高度な分析ができます。
  4. フィルタリング→変換→整列→重複削除の流れが基本パターン
    grepでフィルタ、sedで変換、sortで整列、uniqで重複削除、といった流れは非常によく使います。このパターンを頭に入れておくと、新しいシナリオでも応用しやすくなります。

まとめ

grep, sed, sort, uniqをパイプでつなぐとテキスト処理でやりたいことって大体できちゃいます。実際の業務では、大量のログからエラーパターンを抽出したり、大量のテキストデータを整形したり、簡易的なレポートを生成したり、と、

  • マウス操作では困難な大量データ処理が、コマンド一発で可能に
  • 正規表現やオプションを活用して高度な分析も簡潔に
  • ワンライナーで目の前の課題をパパッと解決できるときもちがいい

ちゃなことで、今回紹介した事例を参考に、自分の環境や課題にあったコマンドの組み合わせを試してみてください。

慣れれば慣れるほど、自己満に浸れると思います。