Linuxテキストフィルタ完全ガイド|cat/cut/sort/uniq/tr/sed/head/tail他【LinuC 1.03.2】

LinuC対策

この記事はLinuC Level1 副主題1.03.2「フィルタを使ったテキストストリームの処理」に対応した要点解説です。試験で問われる範囲に絞り、テキスト処理コマンドの用途・オプション・弁別ポイントを整理しました。

📚 LinuC Level1 完全攻略マップ(全39サブ項目)へ戻る


目次

  1. この記事でできるようになること
  2. 表示系:cat / head / tail / less / more
  3. 集計・番号付け:wc / nl / cat -n / cat -b
  4. バイナリダンプ:od
  5. 並べ替えと重複除去:sort / uniq
  6. 切り出しと結合:cut / paste / join
  7. 分割:split
  8. 文字変換:tr / sed
  9. 整形:pr / fmt / expand / unexpand
  10. よくある質問(FAQ)
  11. まとめ
  12. 模擬問題にチャレンジ(ランダム出題)

1. この記事でできるようになること

  • headtail-n-c-fとデフォルト行数
  • catlessmoreの表示動作の違い
  • wc-l-w-c-mとデフォルト出力
  • nl -b a-b tcat -ncat -bの空行の扱い
  • od-o-x-b-c-t c
  • sort -k -n-uuniqの出力ファイル指定
  • cut -d -f-c-bpaste -djoin
  • split -lのデフォルト1000行と接頭辞xaaxab
  • trの文字クラス([:lower:][:upper:][:alpha:][:digit:][:alnum:][:space:]
  • tr-d(削除)/-s(圧縮)/ファイル直接指定不可
  • pr -l-h+m:nfmt -w
  • expand -t-iunexpand -a

2. 表示系:cat / head / tail / less / more

コマンド 動作
cat ファイル内容を一度に全て標準出力へ出力(編集不可)
head ファイルの先頭を表示(デフォルト10行)
tail ファイルの末尾を表示(デフォルト10行)
less ページャ。1画面ずつ表示、双方向スクロール可能(編集不可)
more ページャ。1画面ずつ表示(lessの旧版、編集不可)

2-1. head / tail の行数・バイト数指定

書式 意味
head -n 5 file 先頭5行(-n Nで行数指定)
head -5 file 先頭5行(-n省略可、数値のみ)
head --lines=5 file 先頭5行(ロングオプション)
head file 先頭10行(デフォルト)
head -c 500 file 先頭500バイト-c Nでバイト数指定)
tail -n 5 file 末尾5行(-n-5--lines=5も同等)
tail -f file 末尾をリアルタイム監視-f=follow、Ctrl+Cで終了)

tail -f -n 5 /var/log/messagesのように-f-nを併用すると、初期表示を5行にしてから追記監視に入ります。ログ監視の定番形です。

2-2. catlessmoreの使い分け

catはファイル内容を一度に全て出力して終了します。長いファイルでは画面を流れてしまうため、1画面ずつ確認したい場合はページャ(lessmore)を使います。どちらも編集はできません。vinanoは編集可能なエディタなので分類が違います。


3. 集計・番号付け:wc / nl / cat -n / cat -b

3-1. wc(行・単語・文字数のカウント)

書式 出力内容
wc file 行数・単語数・バイト数・ファイル名(デフォルトで3つすべて)
wc -l file 行数のみ(lines)
wc -w file 単語数のみ(words、空白区切り)
wc -c file バイト数のみ(chars/bytes)
wc -m file 文字数のみ(マルチバイト考慮)
wc -lwc file 行・単語・バイトを明示指定(wc fileと同じ結果)

3-2. 行番号付け:nlcat -n / cat -b の違い

空行の扱いで動作が分かれます。試験頻出。

書式 空行への付番 備考
cat -n file する(全行に番号)
cat -b file しない(空行除く)
nl file(デフォルト) しない(-b t相当) t=text(本文のみ)
nl -b a file する(全行に番号) a=all
nl -b t file しない(空行除く) デフォルトと同じ
⚠️ 空行付番の対応関係
・空行含めて全行に付番:cat -n / nl -b a
・空行除いて付番:cat -b / nl(デフォルト)/ nl -b t

4. バイナリダンプ:od

od(octal dump)はバイナリファイルを指定した表現形式で表示します。デフォルトは8進数です。

オプション 表示形式
なし(デフォルト) 8進数表示
-o 8進数(デフォルトと同義)
-b 1バイトごとの8進数
-x 16進数
-d 10進数
-c ASCII文字(非印字はエスケープ\n\t\0等)
-t c type指定でchar=-cと同等

5. 並べ替えと重複除去:sort / uniq

5-1. sortの主要オプション

オプション 意味
なし 辞書順ソート(102より前に並ぶ)
-n 数値としてソート
-r 逆順(降順)
-k N N列目を基準にソート
-t X フィールド区切り文字をXに指定
-u 重複行を除去(sortしつつuniq
-f 大文字小文字を区別しない

sort -k 2 -n fileのように-k-nを組み合わせると「2列目を数値として昇順」になります。-nを付け忘れると辞書順になり、102より前に並ぶので注意。sort FileA FileBのように複数ファイルを渡すと合わせて並べ替えます。

5-2. uniqの動作と注意点

uniq連続して重複した行だけを1行にまとめます。そのため、ファイル全体の重複除去には事前にsortを通す必要があります。

書式 意味
uniq file 連続重複を1行にまとめて標準出力
uniq file newfile 結果をnewfileに出力(第2引数が出力先
uniq file > newfile リダイレクトで出力(上記と同等の結果)
uniq -c 件数付きで表示
uniq -d 重複行のみ表示
uniq -u 一度しか現れない行のみ表示
⚠️ uniqの第2引数
uniq file1 file2は「file1とfile2を合わせて処理」ではなく、file1を入力、file2を出力先として扱います。珍しい仕様なので頻出です。通常のリダイレクト>でも同じ結果になります。
# 2ファイルを合わせて並べ替え、重複を除いてListに追記
$ sort FileA FileB | uniq >> List
$ sort -u FileA FileB >> List   # -u で同じ結果

6. 切り出しと結合:cut / paste / join

6-1. cut(フィールド・文字の切り出し)

オプション 意味
-d X 区切り文字をXに指定(デフォルトはタブ
-f N N番目のフィールドを抽出(1,71-7も可)
-c N N番目の文字を抽出(区切り文字不要)
-b N N番目のバイトを抽出(ASCIIなら-cと同じ結果)
# /etc/passwd のユーザ名(1)とログインシェル(7)
$ cut -d : -f 1,7 /etc/passwd

# 各行の2番目の文字
$ cut -c 2 /etc/passwd

6-2. paste(横方向の連結)

pasteは複数ファイルの同じ行番号同士を横に連結します。区切り文字はデフォルトでタブ、-dで変更できます。

# タブ区切りで横連結
$ paste file1 file2

# 区切り文字をコロンに
$ paste -d : file1 file2

catは複数ファイルを縦に連結(下に追加)するので、用途が異なります。

6-3. join(共通キーで結合)

joinは2つのファイルで共通するフィールド(キー)が一致する行を結合します(DBのINNER JOIN相当)。両ファイルがそのキーでソート済みである必要があります。

# コロン区切りでキー結合
$ join -t : users.txt shells.txt

7. 分割:split

splitは指定行数(または指定バイト数)でファイルを分割します。

書式 動作
split file デフォルトで1000行ごとに分割、出力名はxaaxab
split -l N file [prefix] N行ごとに分割。接頭辞を指定するとprefixaaprefixab
split -b N file [prefix] Nバイトごとに分割
# 500行ごとに分割、出力名は hogeaa/hogeab/...
$ split -l 500 file hoge

8. 文字変換:tr / sed

8-1. trの基本動作

tr(translate)は1文字単位の変換・削除・連続圧縮を行います。ファイルを直接引数にできないため、必ずリダイレクト(<)またはパイプで入力を渡します。

書式 意味
tr SET1 SET2 SET1の各文字をSET2の対応文字に変換
tr -d SET1 SET1の文字を削除
tr -s SET1 SET1の連続文字を1文字に圧縮
tr -c SET1 SET2 SET1の補集合を対象にする

8-2. trの文字クラス

文字クラス 意味
[:lower:] 英小文字 a-z
[:upper:] 英大文字 A-Z
[:alpha:] 英字 a-zA-Z(英大小文字両方)
[:digit:] 数字 0-9
[:alnum:] 英数字 a-zA-Z0-9
[:space:] 空白全般(スペース・タブ・改行・CR・フォームフィード等)
[:blank:] スペースとタブのみ([:space:]より狭い)
# 英小文字を英大文字に(4通りすべて同じ結果)
$ tr 'a-z' 'A-Z' < /etc/hosts
$ tr '[:lower:]' '[:upper:]' < /etc/hosts
$ cat /etc/hosts | tr a-z A-Z
$ cat /etc/hosts | tr [:lower:] [:upper:]

# 文字を削除(SET1に複数文字を並べる。-d -d の複数指定は不可)
$ tr -d 'ac' < file

# スペースの連続を1つに圧縮
$ tr -s ' ' < file

# 変換した結果をファイルに保存
$ tr 'PINGT' 'pingt' < file.txt > hoge.txt
⚠️ trはファイル直接指定不可
tr 'a' 'b' filetr 'a' 'b' file1 file2はエラーになります。入力は< fileまたはcat file |で渡し、出力は> newfileで保存します。

8-3. sed(パターン置換)

sedは行単位・パターン単位の置換を行います。こちらはファイルを直接引数にできます

# 置換(g=行内すべて、g無しは各行の最初の1箇所のみ)
$ sed 's/PINGT/pingt/g' file.txt

# 特定の文字を削除
$ sed 's/[ac]//g' file

9. 整形:pr / fmt / expand / unexpand

9-1. pr(印刷用整形)

prはヘッダ(日付・ファイル名・ページ番号)を付けて印刷用ページに整形します。

オプション/書式 意味
-l N 1ページあたりの行数(デフォルト66)
-h 文字列 ヘッダのファイル名部分を差し替え
+m:n ページ範囲をコロン区切りで指定(+1:2で1〜2ページ目)
-t ヘッダ/フッタを抑制(-hと間違えやすい)
# 1ページ30行
$ pr -l 30 httpd.conf

# ヘッダ名を「testfile」に差し替えて1ページ30行
$ pr -h testfile -l 30 httpd.conf

# 1ページ30行で、1ページ目から2ページ目までを表示
$ pr -l 30 +1:2 httpd.conf
⚠️ prのページ範囲指定
ページ範囲は+開始:終了の形式で、区切りはコロン。ハイフンやカンマ、--pageのようなロングオプションは存在しません。

9-2. fmt(幅指定の折り返し)

fmtは段落テキストを指定幅で折り返します。1行あたりの最大文字数を指定するコマンドと問われたらfmtです(pr-lは行数なので混同しないこと)。

オプション 意味
-w N 1行の最大幅(デフォルト75程度)
# 1行30文字に整形
$ fmt -w 30 httpd.conf

9-3. expand(タブ→スペース)/unexpand(スペース→タブ)

書式 意味
expand -t N file タブをN個のスペースに変換(-t 1でタブ→スペース1つ)
expand -i -t N file 行頭のタブのみ変換(-i=initial)
unexpand file スペースをタブに変換(行頭のみが対象、デフォルト)
unexpand -a -t N file 行頭以外も含めて変換(-a=all、--allも同じ)
⚠️ デフォルト挙動の方向が逆
expand:デフォルトで行頭/行中すべてのタブを変換。行頭のみに限定するなら-i
unexpand:デフォルトで行頭のみ変換。行頭以外も対象にするなら-a

10. よくある質問(FAQ)

Q. head fileとオプション無しで叩くと何行出る?

デフォルト10行です。tailも同じくデフォルト10行。5行にしたい場合は-n 5-5--lines=5のいずれか。

Q. head -c 5head -n 5の違いは?

-cバイト数(5バイト)、-n行数(5行)。用途がまったく異なります。

Q. cat -nnlはどう違う?

空行の扱いが違います。cat -n全行に番号を付けますが、nlはデフォルト(-b t)で空行を除いて付番。nl -b aにすると空行も含めます。cat -bnlデフォルトと同じく空行を除いて付番します。

Q. sort-nを付けないとどうなる?

辞書順(文字列として比較)になります。1029を並べると10, 2, 9の順。数値として正しく並べるには-nを付けて2, 9, 10に。

Q. uniqが重複を除去してくれない

uniq連続した重複しか見ません。散在する重複を除きたい場合はsortでまとめてからuniqに通すか、sort -uで一発処理します。

Q. trtr 'a' 'b' fileと書くとエラーになるのはなぜ?

trファイルを引数として受け取らない設計です。入力はリダイレクト(tr 'a' 'b' < file)かパイプ(cat file | tr 'a' 'b')で渡します。

Q. tr -d 'a' -d 'c'は使える?

使えません。-dは複数指定できないので、tr -d 'ac'のようにSET1に削除したい文字をまとめて並べます。

Q. splitをオプション無しで叩くと何行ずつ?

1000行ごとに分割され、出力ファイル名はデフォルトでxaaxab…になります。接頭辞を指定すればprefixaaprefixab…に変わります。


11. まとめ

  • 表示headtail(デフォルト10行、-n行数、-cバイト、-f監視)/cat(一度に全出力)/lessmore(ページャ)
  • カウントwc(無指定で行・単語・バイト)/-l行/-w単語/-cバイト/-m文字
  • 行番号:全行→cat -nnl -b a、空行除く→cat -bnlnl -b t
  • バイナリod(デフォルト8進、-x16進、-c-t cASCII)
  • ソートsort -k N -n(列+数値)/-u重複除去/複数ファイル合成可
  • 重複除去uniqは連続重複のみ、出力先を第2引数にも指定可
  • 切り出しcut -d 区切り -f 列-c文字位置/-bバイト位置
  • 結合paste(横連結、-d区切り)/join(キー一致、両者ソート済み必須)
  • 分割split(デフォルト1000行、xaa命名、-l行数/-bバイト)
  • 変換tr(1文字単位、ファイル直接指定不可)/文字クラス[:lower:][:space:]-d削除/-s圧縮
  • 整形pr -l行数/-hヘッダ/+m:nページ範囲(コロン)、fmt -w幅、expand -t/-iunexpand -a

📚 次の副主題:ストリーム・パイプ・リダイレクトの使用(LinuC 1.03.3)


12. 模擬問題にチャレンジ(ランダム出題)

ここまでの内容を本試験に近い形で確認できます。問題数を選んで「出題スタート」を押すと、主題1.03.2の問題プールからランダムに出題されます。選択肢をクリック/タップすると、正誤と解説がその場で表示されます。

合格ライン目安:75%以上。もっと幅広く解きたい場合はLinuC 模擬問題ポータルから他の分野にも挑戦できます。


おすすめの教材


Linux教科書 LPICレベル1

Linux教科書 LPICレベル1 Version 5.0対応(あずき本)

LinuC/LPIC Level1 の定番参考書。出題範囲全体を網羅。


Amazonで見る →

【ウズカレ式】1週間でLinuxの基本操作と管理・運用スキルが学べる講座

累計80,000人以上受講。LinuC Level1を1週間で網羅。テキスト処理コマンドもカバー。


Udemyで講座を見る →


関連記事

📚 LinuC Level1 完全攻略マップへ戻る
全39サブ項目のシラバス準拠マップから他の記事を探せます

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました