変更要約: 初版(主題1.03・副主題1.03.1〜1.03.5に対応)
3.2フィルタを使ったテキストストリームの処理
フィルタ=標準入力を加工して標準出力へ流すコマンド群を学びます。閲覧系(cat・less・head・tail)、抽出・整形系(cut・sort・uniq・wc・nl・tr)、結合・分割系(paste・join・split)、その他(sed・od・expand/unexpand・fmt・pr)の役割を押さえます。
UNIX 哲学は「小さな道具を組み合わせる」です。1つ1つは単機能のフィルタをパイプでつなぎ、ログ集計や CSV 加工を数十文字で済ませるのが Linux 流のテキスト処理です。この節は道具箱の中身を揃える回で、つなぎ方(パイプ)は次節で扱います。
3.2.1閲覧・抽出・集計の定番
- 閲覧=cat(全部を連結表示)・less(ページャで前後移動)・head/tail(先頭/末尾 n 行。
tail -fはログの追記を追いかける)。 - 抽出=cut(
-d, -f2=区切り文字とフィールド指定)/変換=tr(文字の置換・削除。tr a-z A-Z)/行番号=nl。 - 集計=sort(並べ替え。
-n数値・-r逆順)→ uniq(連続する重複を除去・-cで件数)→ wc(-l行数)。uniq は sort 済みが前提が鉄則。
3.2.2結合・分割・そのほかの道具
- paste=複数ファイルを行単位で横に連結/join=共通フィールドで2ファイルを突き合わせ結合/split=大きなファイルを一定行数/サイズ序で分割。
- sed=ストリームエディタ(
sed 's/old/new/g'の置換が代表。詳細は 3.4)/od=バイナリを8進/16進で表示(octal dump)。 - 空白・レイアウト=expand/unexpand(タブ⇔スペース変換)・fmt(行の長さを整える)・pr(印刷向けにページ整形)。
「ログを流し読み=less・追記を監視=tail -f」「CSV の2列目=cut -d, -f2」「重複行の件数=sort → uniq -c」「大文字化=tr」「タブ→スペース=expand」 が定番の対応です。uniq 単体では離れた重複を消せない(sort が先)は最頻出のひっかけです。
実戦のログ集計を一本組んでみると道具の役割が腑に落ちます。「アクセスログから IP 別のアクセス数上位を出す」は cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -5 = cut で1列目(IP)を抜き → sort で同じ IP を隣接させ → uniq -c で件数付き重複除去 → sort -nr で件数の降順 → head で上位5件という流れです。それぞれのフィルタはファイルを書き換えず、流れてきたテキストを加工して次へ渡すだけ、という感覚が掴めれば合格圏です。join は「社員ID⇔名前」のようなマスタ突き合わせに使うリレーショナルな結合で、単純に横へ貼る paste と混同しないこと。split は split -l 1000 big.log part_ のように分割後の接頭辞を指定します。バイナリの中身をどうしても覗きたいときの od、印刷レイアウトの pr まで含め、「どの場面でどれか」を対応表で覚えるのが効率的です。
| やりたいこと | コマンド | 要点 |
|---|---|---|
| 追記され続けるログを監視 | tail -f | リアルタイムに追随 |
| CSV の特定フィールド抽出 | cut -d, -f2 | -d 区切り・-f 列番号 |
| 重複行を数える | sort | uniq -c | uniq は隣接行のみ対象 |
| キーで2表を結合 | join | 横貼りは paste |
ひっかけ: 「uniq はファイル全体の重複行をすべて削除する」は誤りです。uniq が見るのは隣接行だけなので、先に sort で並べる必要があります。また「cat は大きなファイルの閲覧に最適」も実務的には誤り寄り=ページ移動できる less が適切で、cat は連結・小さなファイル向けです。
3.2.3この節のまとめ
- 閲覧=cat/less/head/tail(-f)・抽出=cut・変換=tr・集計=sort→uniq(-c)→wc(uniq は sort 後)
- 結合=paste(横貼り)/join(キー結合)・分割=split・他に sed/od/expand/fmt/pr
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. カンマ区切りの CSV ファイルから2番目のフィールドだけを取り出したい。適切なコマンドは?
Q2. ファイル内の重複行を「出現回数付きで」一覧にしたい。適切なコマンドの組み合わせは?
Q3. 稼働中のアプリケーションのログファイルに追記される内容を、リアルタイムで表示し続けたい。適切なコマンドは?

