[Linuxコマンド解説] awkコマンド
awkコマンドとは?
awkコマンドとは、テキストファイルの情報を抽出し、加工するためのコマンドです。
行単位で処理するgrepやsortと異なり、awkコマンドは各行の**列(フィールド)**を個別に参照・加工できます。
また、ifやforなどの制御構造を用いることで、より柔軟にファイルを処理できます。
awkコマンドの構文
awkコマンドの構文は以下です。
$ awk '{アクション}' ファイル名
$ cat awk.txt
1 2 3
4 5 6
7 8 9
$ awk '{print $1}' awk.txt
1
4
7
条件を指定すると、その条件が真の行にのみアクションを実行します。
$ awk '条件 {アクション}' ファイル名
$ 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 | 現在処理中のファイルにおける行番号(ファイルごとに1からリセット) |
| 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未満の場合、すべてのフィールドを出力する」という意味だったんですね。
4.区切り文字の指定(-Fオプション)
デフォルトの区切り文字はスペースですが、-Fオプションで変更できます。
例えば、コロン(:)区切りの/etc/passwdから各行の1列目(ユーザー名)を取得するには以下のようにします。
$ awk -F: '{print $1}' /etc/passwd
root
daemon
bin
...
まとめ
今回は、一行一行に対して柔軟な処理ができるawkコマンドをご紹介しました。
今回ご紹介した内容以外にも、正規表現を使う方法や、出力形式を変更する方法など、awkコマンドをもっと便利に使える方法もあります。
ぜひ、ご自分でも調べてみてください。
コマンド一覧はこちら
Discussion