テキストフィルタとは
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 n | n番目のフィールドから行末までを基準に並べ替える(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進数等でダンプ表示する(バイナリファイルの中身を確認する際に使う) |
split | 1つの大きなファイルを、指定したサイズ・行数ごとに複数のファイルへ分割する |
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 # 展開後のファイルを作成せずに圧縮ログの内容を検索する