🔧

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

に公開

 

awkコマンドとは?

awkコマンドとは、テキストファイルの情報を抽出し、加工するためのコマンドです。
ファイル全体を対象に処理するgrepsortに対して、awkコマンドはファイルの一行一行に対して処理を実行します。
また、ifやforなどの制御構造を用いることで、より柔軟にファイルを処理できます。

awkコマンドの構文

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

$ awk '{アクション}' ファイル名
条件分岐を用いる場合
$ awk '条件 {条件が真の場合のアクション}{条件が偽の場合のアクション}' ファイル名

awkコマンドの例

各行の1列目を抽出するコマンド
~$ cat awk.txt
1 2 3
4 5 6
7 8 9
~$ 
~$ awk '{print $1}' awk.txt
1
4
7
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 現在のレコード数
NR 現在のレコード数(複数ファイルの場合は累計)

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

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

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

Discussion