パイプとテキスト操作コマンドで爆発的に広がる「データ処理力」
- 2025年03月12日
- CATEGORY- 1. 技術力{技術情報}
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_user
やdb_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アドレス)を抽出していますが、sed
やcut
で同様の抽出が可能です。
例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関連のプロセスをメモリ使用量順で確認」するといったレポーティングがワンライナーで実現できます。
ヒント・テクニック
- 小さなパイプから始める
最初はgrep
→sort
→uniq
のような単純な流れから始めて、sed
による置換やawk
による列抽出を追加していく。 - 正規表現を駆使する
grep
やsed
の正規表現を使いこなせば、複雑なパターンマッチもシンプルなコマンドで可能になります。 uniq -c
やsort -n
などオプションの活用
uniq
には-c
(出現回数を数える)があり、sort
には-n
(数値ソート)、-r
(逆順ソート)があります。これらを組み合わせると高度な分析ができます。- フィルタリング→変換→整列→重複削除の流れが基本パターン
grep
でフィルタ、sed
で変換、sort
で整列、uniq
で重複削除、といった流れは非常によく使います。このパターンを頭に入れておくと、新しいシナリオでも応用しやすくなります。
まとめ
grep
, sed
, sort
, uniq
をパイプでつなぐとテキスト処理でやりたいことって大体できちゃいます。実際の業務では、大量のログからエラーパターンを抽出したり、大量のテキストデータを整形したり、簡易的なレポートを生成したり、と、
- マウス操作では困難な大量データ処理が、コマンド一発で可能に
- 正規表現やオプションを活用して高度な分析も簡潔に
- ワンライナーで目の前の課題をパパッと解決できるときもちがいい
ちゃなことで、今回紹介した事例を参考に、自分の環境や課題にあったコマンドの組み合わせを試してみてください。
慣れれば慣れるほど、自己満に浸れると思います。
- 2025年03月12日
- CATEGORY- 1. 技術力{技術情報}