🔧

[Linuxコマンド解説] awkコマンド

に公開

 

awkコマンドとは?

awkコマンドとは、テキストファイルの情報を抽出し、加工するためのコマンドです。
行単位で処理するgrepsortと異なり、awkコマンドは各行の**列(フィールド)**を個別に参照・加工できます。
また、ifやforなどの制御構造を用いることで、より柔軟にファイルを処理できます。

awkコマンドの構文

awkコマンドの構文は以下です。

$ awk '{アクション}' ファイル名
各行の1列目を抽出するコマンド
$ cat awk.txt
1 2 3
4 5 6
7 8 9

$ awk '{print $1}' awk.txt
1
4
7

 
条件を指定すると、その条件が真の行にのみアクションを実行します。

条件を用いる場合
$ awk '条件 {アクション}' ファイル名
2行目までを抽出するコマンド
$ 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

$1FNRなど、見たことがない表現がありますね。
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と表します。

コマンドの例をもう一度確認してみましょう。

各行の1列目を抽出するコマンド
$ 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 処理した行の累計数(複数ファイルをまたいで加算)

コマンドの例をもう一度確認してみましょう。

2行目までを抽出するコマンド
$ 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コマンドをもっと便利に使える方法もあります。
ぜひ、ご自分でも調べてみてください。

 
 
コマンド一覧はこちら
https://zenn.dev/comf_nakamura/articles/linux_command

Discussion