テキストフィルタとは

Linuxのコマンドラインには、テキストの一部を抜き出す・並べ替える・重複を除く・文字数を数える、といった単純な加工を行う小さなコマンド(フィルタ)が数多く用意されています。これらは単体でも使えますが、パイプ(|)でつなぎ合わせることで、より複雑なテキスト処理を組み立てることができますパイプ・リダイレクトの基本については「標準入出力とパイプ・リダイレクト」の技術解説記事で扱っています。[1]。

cut:行から特定のフィールド・文字位置を取り出す

cutは、各行から指定した列(フィールド)や文字位置だけを抜き出すコマンドです。

オプション効果
-f リスト指定したフィールド番号を取り出す(例:-f 1,3で1列目と3列目)
-d 区切り文字フィールドの区切り文字を指定する(既定はタブ文字)
-c リストフィールドではなく、文字位置で指定した範囲を取り出す
cut -d: -f1 /etc/passwd     # /etc/passwdをコロン区切りで見て、1列目(ユーザー名)だけを取り出す
cut -c1-10 file.txt          # 各行の先頭10文字だけを取り出す

sort:行を並べ替える

sortは、テキストの各行を指定した基準で並べ替えるコマンドです。

オプション効果
-n文字列としてではなく、数値として比較して並べ替える
-r並べ替えの結果を逆順(降順)にする
-k nn番目のフィールドから行末までを基準に並べ替える(n番目のフィールドだけを基準にするには-k n,nを指定する)
-t 区切り文字フィールドの区切り文字を指定する
-u比較キーが同じ行を1行にする
-f大文字・小文字を区別せずに並べ替える
sort file.txt                 # 行を現在のロケールの照合順序で並べ替える
sort -n numbers.txt            # 数値として並べ替える("10"が"9"より前に来ないようにする)
sort -k2,2 -t: /etc/passwd     # コロン区切りの2番目のフィールドを基準に並べ替える
sort -nr file.txt              # 数値の降順で並べ替える

数値を含むデータを-n無しでsortすると、"10"が"2"より前に来てしまう(文字列として先頭の文字から比較されるため)点に注意してください。

uniq:連続する重複行をまとめる

uniqは、連続して隣り合う重複行をまとめる(または除く)コマンドです。

オプション効果
-c各行の前に、その行が連続して出現した回数を表示する
-d連続して2回以上出現した行のみを表示する
-u連続する同一行の出現回数が1回の行のみを表示する
-i大文字・小文字を区別せずに比較する
sort access.log | uniq -c | sort -nr   # 出現回数を数えて、多い順に並べ替える定番の組み合わせ

uniqは隣り合う行同士しか比較しないため、ファイル全体から重複を除きたい場合は、先にsortで同じ内容の行を隣接させてからuniqに渡す必要があります。

wc:行数・単語数・バイト数を数える

wc(word count)は、テキストの行数・単語数・文字数・バイト数を数えるコマンドです。

オプション効果
-l行数を数える
-w単語数を数える
-cバイト数を数える
-m文字数を数える(マルチバイト文字を考慮する)
wc -l access.log       # ログファイルの行数を数える
ls | wc -l              # カレントディレクトリの表示対象のエントリ数(隠しファイルを除く)を数える

tr:文字を変換・削除する

tr(translate)は、標準入力の文字を1文字ずつ変換・削除するコマンドです。ファイル名を引数に取らず、標準入力からのみ読み込む点が他のフィルタと異なります。

オプション効果
(オプション無し)指定した文字集合1を文字集合2に変換する
-d指定した文字集合を削除する(変換は行わない)
-s指定した文字集合内で連続して繰り返される文字を1文字に圧縮する
-c指定した文字集合の補集合(指定していない文字)を対象にする
tr 'a-z' 'A-Z' < file.txt     # 小文字を大文字に変換する
tr -d '\r' < dos.txt > unix.txt   # キャリッジリターン(CR)を削除する(DOS形式→Unix形式の改行変換)
tr -s ' ' < file.txt            # 連続する空白を1つにまとめる

head・tail:ファイルの先頭・末尾を表示する

コマンド効果
head ファイルファイルの先頭部分(既定10行)を表示する
head -n 数指定した行数だけ先頭から表示する
tail ファイルファイルの末尾部分(既定10行)を表示する
tail -n 数指定した行数だけ末尾から表示する
tail -f ファイルファイルの末尾を表示した後、追記される内容をリアルタイムに表示し続ける
head -n 20 access.log     # 先頭20行を表示する
tail -f /var/log/syslog    # ログファイルの追記をリアルタイムに監視する

ログファイルのパスはディストリビューションや設定により異なります。

paste:複数ファイルの行を横に連結する

pasteは、複数のファイルの対応する行同士を、区切り文字(既定はタブ)で連結して1行にまとめるコマンドです。

オプション効果
-d 区切り文字リスト既定のタブの代わりに、指定した区切り文字を使う(複数指定すると順番に繰り返し使われる)
paste names.txt scores.txt        # 2つのファイルの対応する行を、タブ区切りで連結する
paste -d, names.txt scores.txt    # カンマ区切りで連結する

その他の主なフィルタコマンド

出題範囲の用語一覧には、上記に加えて次のようなコマンドも挙げられています。

コマンド役割
nl各行に行番号を付けて表示する
odファイルの内容を8進数・16進数等でダンプ表示する(バイナリファイルの中身を確認する際に使う)
split1つの大きなファイルを、指定したサイズ・行数ごとに複数のファイルへ分割する
md5sum/sha256sum/sha512sumファイルのハッシュ値(チェックサム)を計算し、ファイルの改ざん検出・整合性確認に使う(ただしMD5は衝突耐性が弱く、意図的な改ざんの検出には適さない)
zcat/bzcat/xzcatそれぞれgzip・bzip2・xz形式で圧縮されたファイルを、展開後のファイルを作成せずに内容を表示する
md5sum file.iso              # ファイルのMD5ハッシュ値を計算する
sha256sum file.iso            # ファイルのSHA-256ハッシュ値を計算する
zcat access.log.gz | grep ERROR   # 展開後のファイルを作成せずに圧縮ログの内容を検索する

補足

  1. パイプ・リダイレクトの基本については「標準入出力とパイプ・リダイレクト」の技術解説記事で扱っています。 ↩