[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