Linuxコマンドでテキストデータを絞り込む方法(head, tail, cut, awk)

Linuxコマンドでテキストデータを絞り込む方法(head, tail, cut, awk)

Linux環境で、ログファイルやテキストデータなどから特定の行やフィールドのデータを取り出したいときに便利なのが、フィルタ系コマンド「head」「tail」「cut」「awk」コマンドです。

そこでここでは「head」「tail」「cut」「awk」コマンドを使った基本的なフィルタ方法について紹介します。

動作環境

この記事は、以下の環境で実行した結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

# cat /etc/redhat-release
CentOS Linux release 7.4.1708

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 }'
Memo

「$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
Memo

「||」はOR条件、「&&」はAND条件です。

処理データが多いときは、headコマンドなどと組み合わせることで、あらかじめ処理データから不要な部分を取り除いた上でawkコマンドに引き渡し、より効率的な処理が可能です。

あとがき

head、tail、cut、awkなどのフィルタコマンドは、知っていると作業効率を格段に向上させることができます。Linuxの基本コマンドとして覚えておきたいところです。