このページで解説している内容は、以下の 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ファイルのパーミッション
21ハードリンクの数
3root所有者
4rootグループ
526952ファイルサイズ(バイト数)
64月更新月
711更新日
82024更新年または時刻
9zjsdecodeファイル名
ls -l コマンドで出力される各項目

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
21$2
3root$3
4root$4
526952$5
64月$6
711$7 または $(NF-2)
82024$8 または $(NF-1)
9zjsdecode$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を使いこなすことで、テキストデータから必要な情報を効率的に抽出できます。特に、フィールド変数と組み込み変数を活用した列選択は、日々の業務で頻繁に役立つでしょう。