ShellScript
Linux
awk
UNIX

[初心者向け]Awkの使い方

More than 1 year has passed since last update.

自分用のまとめです。
間違いなどあればご指摘いただけると嬉しいです!

Awkとは?

AWK(オーク)は、プログラミング言語の一つ。テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX 上で開発された。(Wikipediaより)

UnixやLinux環境でファイルを集計したりするときにつかえる便利なプログラミング言語。
Linuxコマンドっぽく使える。

実行方法

# スクリプトをコマンドに含める場合
awk 'スクリプト' [ 入力ファイルのパス ]

# 外部のスクリプトファイルを読み込む場合
awk -f スクリプトファイルのパス [ 入力ファイルのパス ]

# catコマンドを用いることもできる
cat foo.log | awk 'スクリプト'


# 例:foo.txtの中身を出力する
$ awk '{ print $0 }' foo.txt
foo
bar
baz
foobar
foobaz
barbaz

スクリプト

実行方法の'スクリプト'の部分には抽出などのルールを記載する。
'スクリプト'の部分は「パターン文」と「アクション文」から成り立つ。

# 書き方
awk 'パターン { アクション }' [ 入力ファイルのパス ]


# 例:foo.txt内で「bar」という文字列を含む行を出力する
$ awk '/bar/ { print $0 }' foo.txt

パターン

パターンは以下の4種類
1. 正規表現
2. BEGIN
3. END
4. 評価式

正規表現

正規表現はスラッシュの間に入れる。

# 書き方
awk '/正規表現/ { アクション }'

# 例:foo.txt中から最後がbarで終わるものを出力
$ cat foo.txt
foo
bar
baz
foobar
foobaz
barbaz

$ awk '/bar$/ { print $0 }'  foo.txt
bar
foobar

BEGIN,END

BEGINは最初の行を読み込む前の処理を、ENDは最後の行を読み込んだ後の処理を書く。

# 書き方
awk 'BEGIN { 最初の行を読み込む前の処理 } { メイン処理 } END { 最後の行を読み込んだ後の処理 }'

# 例: foo.txtの出力前に==BEGIN==を、出力後に==END==を出力する
$ awk 'BEGIN { print "==BEGIN==" } { print $0} END { print "==END==" }' foo.txt
==BEGIN==
foo
bar
baz
foobar
foobaz
barbaz
==END==

評価式

パターンの部分を評価式にすることも可能

# 書き方
awk '評価式 { アクション }'

# 例:foo.txtからfooに一致する行を出力する
$ awk ' $0 == "foo" { print $0 }'  foo.txt
foo

組み込み変数

awkにあらかじめ定義されている変数。

組み込み変数 内容 デフォルト値
$0 レコード
$n レコードのn番目のフィールド
FILENAME ファイル名 "-"
RS レコードの区切り文字 改行(\n)
FS フィールドの区切り文字 スペース
ORS 出力レコードの区切り文字 改行(\n)
OFS 出力フィールドの区切り文字 スペース
NR 入力中のレコード数 現在の入力ファイル数のレコード数
NF レコード中のフィールド数 現在の入力レコード中のフィールド数
# 例:foo.txtの2行目を出力する
$ awk ' NR == 2 { print $0 }'  foo.txt
bar

# 例:foo.txtの内容をカンマ区切りで出力する
$ awk ' ORS = ","{ print $0 }'  foo.txt
foo,bar,baz,foobar,foobaz,barbaz,

# 例:foo.txtの内容を行番号込で出力する
$ awk ' { print NR, $0 }'  foo.txt
1 foo
2 bar
3 baz
4 foobar
5 foobaz
6 barbaz

参考にさせてもらったサイト

もっと知りたい方は以下のサイトもどうぞ

さくっと知りたい人向け
http://itref.fc2web.com/unix/awk.html
http://www.osaka-kyoiku.ac.jp/~kokugo/nonami/awk/awkmini.html
http://shellscript.sunone.me/awk.html

ガッツリ知りたい方向け
http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_toc.html

歴史とかも知りたい人向け
https://ja.wikipedia.org/wiki/AWK