[Linuxコマンド解説] awkコマンド
awkコマンドとは?
awkコマンドとは、テキストファイルの情報を抽出し、加工するためのコマンドです。
ファイル全体を対象に処理するgrepやsortに対して、awkコマンドはファイルの一行一行に対して処理を実行します。
また、ifやforなどの制御構造を用いることで、より柔軟にファイルを処理できます。
awkコマンドの構文
awkコマンドの構文は以下です。
$ awk '{アクション}' ファイル名
$ awk '条件 {条件が真の場合のアクション}{条件が偽の場合のアクション}' ファイル名
awkコマンドの例
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
~$
~$ awk '{print $1}' awk.txt
1
4
7
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
~$
~$ awk 'FNR < 3 {print $0}' awk.txt
1 2 3
4 5 6
$1やFNRなど、見たことがない表現がありますね。
awkコマンドは、「アクション」「レコードとフィールド」「組み込み変数」など、独自の概念があります。
これらのawkコマンド独自の概念を順に説明します。
awkコマンド独自の概念
1.アクション
awkコマンドには、以下のアクションが定義されています(以下は一部です)。
| アクション | 動作 |
|---|---|
| print ? | ?を出力する |
| next | その行の処理をスキップする |
2.レコードとフィールド
awkコマンドには、レコード(行) とフィールド(列) という概念があります。
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
例えば、上のawk.txtファイルのレコードとフィールドは以下です。
| フィールド1 | フィールド2 | フィールド3 | |
|---|---|---|---|
| レコード1 | 1 | 2 | 3 |
| レコード2 | 4 | 5 | 6 |
| レコード3 | 7 | 8 | 9 |
フィールドの値を$数字と表すことができます。
例えば、$1はフィールド1の値を表します。
なお、フィールドすべては$0と表します。
コマンドの例をもう一度確認してみましょう。
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
~$
~$ awk '{print $1}' awk.txt
1
4
7
上記のawkコマンドは、「各レコードのフィールド1を出力する」という意味だったんですね。
3.組み込み変数
awkコマンドには、以下の組み込み変数が定義されています(以下は一部です)。
| 変数 | 値 |
|---|---|
| FNR | 現在のレコード数 |
| NR | 現在のレコード数(複数ファイルの場合は累計) |
コマンドの例をもう一度確認してみましょう。
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
~$
~$ awk 'FNR < 3 {print $0}' awk.txt
1 2 3
4 5 6
上記のawkコマンドは、「累計レコード数が3未満の場合、すべてのフィールドを出力する」という意味だったんですね。
まとめ
今回は、一行一行に対して柔軟な処理ができるawkコマンドをご紹介しました。
今回ご紹介した内容以外にも、正規表現を使う方法や、出力形式を変更する方法など、awkコマンドをもっと便利に使える方法もあります。
ぜひ、ご自分でも調べてみてください。
コマンド一覧はこちら
Discussion