テキストストリームフィルタ - cat・sort・uniq・wc・head・tail
この記事で達成できること
- 標準入力から受け取ったテキストをフィルタで加工する型を組める
sort/uniqの組み合わせでログ集計を正確に実行できるhead/tailで大容量ファイルの必要部分だけを安全に確認できるcut/tr/nlでフィールド抽出・文字変換・行番号付与ができる- フィルタを連結したワンライナーで頻出の集計タスクを処理できる
LPIC-1 主題 103.2「フィルタを使ったテキストストリーム処理」の中核。フィルタは「標準入力を読み、加工し、標準出力へ書く」コマンド群で、パイプで連結することで強力な処理になる。
どのフィルタをいつ使うか
| やりたいこと | 使うフィルタ | 代表オプション |
|---|---|---|
| 行を並べ替える | sort |
-n 数値 / -r 逆順 / -k キー指定 |
| 重複を除去・集計する | uniq |
-c 件数 / -d 重複のみ |
| 件数を数える | wc |
-l 行 / -w 単語 / -c バイト |
| 先頭/末尾だけ見る | head / tail |
-n 行数 / tail -f 追従 |
| 列を抜き出す | cut |
-d 区切り / -f フィールド |
| 文字を置換/削除 | tr |
-d 削除 / -s 連続圧縮 |
| 行番号を付ける | nl / cat -n |
-b a 全行付番 |
uniq は連続する重複しか集約しないため、ほぼ常に sort と組み合わせる。これが試験でも実務でも最頻出のパターン。
手順
Step 1: ファイルを連結して標準出力に流す
cat access.log cat -n script.sh cat file1 file2 > merged.txt
1 #!/bin/bash
2 echo "start"
3 exit 0
cat は複数ファイルを連結する。-n で行番号、-A で改行・タブなどの不可視文字を可視化できる。1 ファイルを単に表示するだけなら less の方が大容量に強い。
Step 2: ソートして重複を集計する
sort access.log | uniq -c | sort -nr | head -n 5
143 GET /index.html
97 GET /login
61 POST /api/data
28 GET /favicon.ico
12 GET /robots.txt
「ソート → uniq -c で件数化 → 件数で逆順ソート → 上位 5 件」は頻出アクセス集計の定番。uniq -c は直前の Step で sort 済みであることが前提。
Step 3: 行・単語・バイト数を数える
wc -l access.log wc -lwc README.md
10234 access.log 120 856 5421 README.md
-l は行数、-w は単語数、-c はバイト数(-m は文字数)。パイプ末尾に置けば「条件に一致した件数」をそのまま得られる。
Step 4: 先頭・末尾を切り出す
head -n 20 large.csv tail -n 50 syslog tail -f /var/log/nginx/access.log
2026-05-17 10:01:22 INFO start 2026-05-17 10:01:23 INFO ready
tail -f はファイルへの追記をリアルタイム表示する。ログ監視の基本。head と tail を組み合わせると「N 行目から M 行」のような範囲抽出もできる。
Step 5: 列抽出と文字変換
cut -d: -f1,7 /etc/passwd echo "Hello World" | tr 'a-z' 'A-Z' cat data.txt | tr -s ' ' | tr -d '\r'
root:/bin/bash daemon:/usr/sbin/nologin HELLO WORLD
cut -d: -f1 は : 区切りの 1 列目を抽出する。tr は文字単位の変換・削除で、-s は連続文字を 1 個に圧縮、-d は指定文字を削除する。Windows 由来の \r 除去によく使う。
なぜフィルタを連結するのか
各フィルタは「1 つのことだけをうまくやる」という Unix 哲学に従って設計されている。sort は並べ替えだけ、uniq は隣接重複処理だけを担う。単機能だからこそパイプで自由に組み合わせられ、巨大な専用ツールを書かずに集計・抽出を実現できる。
uniq が隣接重複しか扱わないのは、ストリームを一行ずつ処理して状態を持たない設計のため。全体の重複を扱うには事前にソートして同一行を隣接させる必要がある。この制約を理解していれば sort | uniq を反射的に書けるようになる。
トラブルシューティング
症状: uniq -c で重複が集約されない
原因: 入力がソートされていない
確認:
sort file | uniq -c
対処: uniq の前に必ず sort を入れる。または sort -u で「ソート + 重複除去」を一度に行う(ただし -c の件数は得られない)。
症状: sort -n が期待通り並ばない
原因: 数値列に空白や単位文字が混在している、またはキー位置の指定漏れ
確認:
sort -k2 -n data.txt
対処: -k でソート対象フィールドを明示し、-t で区切り文字を指定する。人間可読サイズ(1K, 2M)は sort -h を使う。
症状: tail -f が更新を追わない
原因: ログがローテーションで別 inode に切り替わった
確認:
tail -F /var/log/syslog
対処: -f(小文字)は inode を追従するため、ローテーション後は -F(大文字)でファイル名ベースの追従に切り替える。
作業完了チェックリスト
- [ ]
sort | uniq -c | sort -nrで集計ワンライナーを実行した - [ ]
wc -lをパイプ末尾で件数取得に使った - [ ]
head/tailで大容量ファイルの必要部分のみ確認した - [ ]
cut -d -fでフィールド抽出した - [ ]
trで文字変換・\r削除を確認した
まとめ
| 場面 | コマンド | 目的 |
|---|---|---|
| 集計 | sort | uniq -c | sort -nr |
出現頻度ランキング |
| 件数 | wc -l |
行数カウント |
| 先頭/末尾 | head -n / tail -f |
範囲抽出・追従監視 |
| 列抽出 | cut -d: -f1 |
フィールド切り出し |
| 文字変換 | tr a-z A-Z |
文字単位の置換・削除 |
フィルタの連結はテキスト処理の基本パターン。より複雑なパターンマッチには正規表現と grep が必要になる。