Linux環境で、ログファイルやテキストデータなどから特定の行やフィールドのデータを取り出したいときに便利なのが、フィルタ系コマンド「head」「tail」「cut」「awk」コマンドです。
そこでここでは「head」「tail」「cut」「awk」コマンドを使った基本的なフィルタ方法について紹介します。
目次
headコマンド
テキストファイルの先頭から指定行数を表示する場合は、headコマンドを使用します。デフォルトで先頭から10行目までを表示します。
書式とオプション
書式
head [オプション]... [ファイル]...
主なオプション
オプション | 説明 |
---|---|
-c | 先頭からXバイトだけ表示します。 |
-n | 先頭からX行だけ表示します。-nを付けずに「-X」と指定することも可能です。 |
使用例
先頭から指定した行までを表示
先頭からX行目までを表示するには以下のように実行します。
# head -n X sample.log
先頭から最下行から指定行分を除いて表示
先頭から最下行からX行分を除いて表示するには以下のように実行します。
# head -n -X sample.log
tailコマンド
テキストファイルの最下行から指定行数を表示する場合は、tailコマンドを使用します。デフォルトで最下行から10行分を表示します。
書式とオプション
書式
tail [オプション]... [ファイル]...
主なオプション
オプション | 説明 |
---|---|
-c | 最下行からXバイトだけ表示します。 |
-n | 最下行からX行だけ表示します。 -nを付けずに「-X」と指定することも可能です。 |
-f | ファイルの最下行に追加された行を常に表示します。 |
使用例
最下行から指定行分を表示
最下行からX行分を表示するには以下のように実行します。
# tail -n X sample.log
指定行目から最下行までを表示する
X行目から最下行までを表示するには以下のように実行します。
# tail -n +X sample.log
ファイルの変更を監視する
-fオプションを使用すると、指定したファイルの最下行への追記を監視することができます。ログファイルの目視監視でよく使われます。
# tail -f sample.log
cutコマンド
テキストファイルの各行から、指定したフィールドを取り出すことができるのが「cut」コマンドです。
書式とオプション
書式
cut [オプション]... [ファイル]...
主なオプション
オプション | 説明 |
---|---|
-b | 各行から取り出す位置をバイトで指定します。 |
-c | 各行から取り出す位置を文字数で指定します。 |
-d | 区切り文字を指定します。 |
-f | 各行から取り出すフィールド番号を指定します。 |
使用例
特定の位置の文字を取り出す
文字の位置を指定すると、特定位置の文字を取り出すことができます。
# 3文字目を取り出す
# cut -c 3 sample.txt
# 1文字目と3文字目を取り出す
# cut -c 1,3 sample.txt
# 2文字目から4文字目を取り出す
# cut -c 2-4 sample.txt
# 3文字目以降を取り出す
# cut -c 3- sample.txt
特定フィールドを取り出す
フィールド番号を指定すると、特定位置のフィールドを取り出すことができます。なお、デフォルトのフィールド区切り文字(デリミタ)は「タブ」です。
# 2フィールド目を取り出す
# cut -f 2 sample.txt
# 2フィールド目と4フィールド目を取り出す
# cut -f 2,4 sample.txt
# 3フィールド目から5フィールド目までを取り出す
# cut -f 3-5 sample.txt
# 3フィールド目以降を取り出す
# cut -f 3- sample.txt
区切り文字を指定して、特定フィールドを取り出す
フィールド間の区切り文字(デリミタ)と、取り出すフィールド番号を指定すると、指定したデリミタによって区切られた特定位置のフィールドを取り出すことができます。
# スペース区切りの2フィールド目を取り出す
# cut -d ' ' -f 2 sample.txt
# セミコロン区切りの3フィールド目を取り出す
# cut -d ';' -f 3 sample.txt
# カンマ区切りの5フィールド目を取り出す
# cut -d ',' -f 5 sample.txt
awkコマンド
空白で区切られたテキストデータの各行から、特定のフィールドを取り出すことができるのが「awk」コマンドです。指定したフィールドを取り出すには「cut」コマンドでも可能ですが、フィールド間の空白が一定でない場合は「awk」コマンドを使用します。
書式とオプション
書式
awk [オプション] [コマンド] [ファイル……]
基本的な記述方法
awk '(パターン) {アクション}' ファイル名
テキストデータ(テキストファイル、もしくは標準入力に渡されたテキストデータ)を1行ずつ読み、パターンに一致する行に対してアクションを実行します。
使用例
指定したパターンに一致する行を取り出す
「ls -l」の出力で、5フィールド目(ファイルサイズ)が、1000000(約1MB)以上の行を取り出すには
# ls -l | awk '($5 >= 1000000) { print }'
sample.txtの1行目を取り出すには
# awk '(NR == 1){ print }' sample.txt
「ls -l」の出力で、行頭が「l」から始まる行(シンボリックリンク)を取り出すには
# ls -l | awk '(/^l/) { print }'
「$x」は、x番目のフィールドを意味しています。
「NR」は、行番号を意味しています。
「/正規表現/」とすることで、パターンを正規表現で記述できます。
指定したフィールドを取り出す
sample.txtの各行で、2フィールド目を取り出すには
# awk '{ print $2 }' sample.txt
sample.txtの1行目で、2フィールド目を取り出すには
# awk '(NR == 1){ print $2 }' sample.txt
sample.txtの各行で、フィールドの順番を入れ替えて取り出すには
# awk '{ print $3,$1,$2 }' sample.txt
複数のパターンを指定する
sample.txtの1行目および9行目で、1フィールド目を取り出すには
# awk '(NR == 1 || NR == 9){ print $1 }' sample.txt
sample.txtの6行目から8行目で、1フィールド目を取り出すには
# awk '(NR > 5 && NR <= 8){ print $1 }' sample.txt
「||」はOR条件、「&&」はAND条件です。
処理データが多いときは、headコマンドなどと組み合わせることで、あらかじめ処理データから不要な部分を取り除いた上でawkコマンドに引き渡し、より効率的な処理が可能です。
あとがき
head、tail、cut、awkなどのフィルタコマンドは、知っていると作業効率を格段に向上させることができます。Linuxの基本コマンドとして覚えておきたいところです。