このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:printとフィールド変数:awkコマンド

awkコマンドの概要
awk
コマンドは、テキストデータを行やフィールドごとに処理し、必要な情報を抽出・加工するための強力なツールです。特に、特定のフィールド(列)を抽出して表示する列選択は、awk
でもっともよく使われる処理の一つです。
【書式】awk 'パターン { アクション }' ファイル名
- パターン:アクションを実行する条件を指定します。
- アクション:パターンにマッチした場合に実行される処理を記述します。

printとフィールド変数
ここでは、/usr/bin
ディレクトリを対象として実行した ls -l
コマンドの出力結果を加工し、ファイルのパーミッションとファイル名だけを表示する方法を見ていきましょう。
/usr/bin
ディレクトリのファイル一覧
まず、ls -l /usr/bin
コマンドを実行すると、以下のような出力が得られます。
user01@ubuntu-vm:~$ ls -l /usr/bin
(省略)
-rwxr-xr-x 1 root root 26952 4月 11 2024 zjsdecode
-rwxr-xr-x 1 root root 2206 4月 9 2024 zless
-rwxr-xr-x 1 root root 1842 4月 9 2024 zmore
-rwxr-xr-x 1 root root 4577 4月 9 2024 znew
(省略)
各行の情報はスペースで区切られており、以下のようなフィールドに分かれています。
フィールド番号 | フィールド内容 | 説明 |
---|---|---|
1 | -rwxr-xr-x | ファイルのパーミッション |
2 | 1 | ハードリンクの数 |
3 | root | 所有者 |
4 | root | グループ |
5 | 26952 | ファイルサイズ(バイト数) |
6 | 4月 | 更新月 |
7 | 11 | 更新日 |
8 | 2024 | 更新年または時刻 |
9 | zjsdecode | ファイル名 |
lsコマンドの結果から特定のフィールドを表示
目的のファイルのパーミッションとファイル名を取り出すために、awk
コマンドを使用して1列目と9列目を表示します。
user01@ubuntu-vm:~$ ls -l /usr/bin | awk '{print $1, $9}'
(省略)
-rwxr-xr-x zjsdecode
-rwxr-xr-x zless
-rwxr-xr-x zmore
-rwxr-xr-x znew
(省略)
解説
$1
:ファイルのパーミッションを表します。$9
:ファイル名を表します。
組み込み変数NF
とフィールド変数
awk
には、現在のレコード(行)のフィールド数を保持する組み込み変数NF
があります。この変数を使うと、最後のフィールドを簡単に参照できます。
$NF
:最後のフィールドを表します。$(NF-1)
:後ろから2番目のフィールドを表します。
先ほどの例では、$9
の代わりに$NF
を使用しても同じ結果が得られます。
user01@ubuntu-vm:~$ ls -l /usr/bin | awk '{print $1, $NF}'
(省略)
-rwxr-xr-x zjsdecode
-rwxr-xr-x zless
-rwxr-xr-x zmore
-rwxr-xr-x znew
(省略)
フィールド番号とフィールド内容の対応表
以下の出力行について、各フィールドと$
変数の対応をまとめます。
-rwxr-xr-x 1 root root 26952 4月 11 2024 zjsdecode
フィールド番号 | フィールド内容 | $ 変数 |
---|---|---|
1 | -rwxr-xr-x | $1 |
2 | 1 | $2 |
3 | root | $3 |
4 | root | $4 |
5 | 26952 | $5 |
6 | 4月 | $6 |
7 | 11 | $7 または $(NF-2) |
8 | 2024 | $8 または $(NF-1) |
9 | zjsdecode | $9 または $NF |
ポイント
$NF
:最後のフィールド(この例ではzjsdecode
)を指します。$(NF-1)
:後ろから2番目のフィールド(2024
)を指します。$(NF-2)
:後ろから3番目のフィールド(11
)を指します。
演算を用いたフィールドの参照
awk
では、アクション内で演算が可能です。これにより、フィールド数が多い場合や一定しない場合でも、相対的にフィールドを指定できます。
例:最後のフィールドとその1つ前のフィールドを表示
user01@ubuntu-vm:~$ ls -l /usr/bin | awk '{print $(NF-1), $NF}'
(省略)
2024 zjsdecode
2024 zless
2024 zmore
2024 znew
(省略)
解説
$(NF-1)
:後ろから2番目のフィールド(2024
)を表示します。$NF
:最後のフィールド(ファイル名)を表示します。
この方法は、フィールド数が変動する場合にも有効で、柔軟にデータを抽出できます。
まとめ
awk
コマンドは、テキストデータから特定のフィールドを抽出・表示するのに非常に便利です。- フィールド変数(
$1
,$2
, …,$NF
)を使用して、必要なフィールドを指定できます。
・$NF
:最後のフィールドを指します。
・$(NF-1)
:後ろから2番目のフィールドを指します。 - 組み込み変数
NF
を利用することで、フィールド数が一定しないデータでも柔軟に対応できます。 - 演算を用いてフィールドを指定することで、スクリプトの汎用性と可読性が向上します。
awk
を使いこなすことで、テキストデータから必要な情報を効率的に抽出できます。特に、フィールド変数と組み込み変数を活用した列選択は、日々の業務で頻繁に役立つでしょう。