awk
コマンド
今、お兄ちゃんから
正規表現を使った
コマンドを学んでいるよ!
これまでで
grep
と
sed
を学んだんだ!
今回は
awk
を
学んでいこう!
awk
は
決まった構造を持った内容を
処理するのが得意なコマンドだよ
awk
は制作者3名の頭文字で
特定の意味を持った
単語ではないんだ
awk [オプション]... 'パターン {アクション}' [ファイル]
オプション | 役割 |
---|---|
-F 文字列 | 指定された文字列をフィールド区切り文字にする |
構造を持った内容…例えば今まで扱ったような
/etc/passwd
のようなものかな?そうだね後で
/etc/passwd
を扱ってみよう!読み込む内容の単位を「レコード(record)」と呼ぶんだ デフォルトでは1行が「レコード」となるよ
基本的には1行ずつ読み込んでその内容を解析していくんだね
レコードは「フィールドセパレータ(field separator, FS)」 という区切り文字で区切られていてその区切られた要素を「フィールド」と呼ぶよ デフォルトではスペースやタブなど空白文字がフィールドセパレータになっているんだ
awk
の操作は指定すれば一部のレコードだけに処理を絞れるんだね!
定義ばかりで難しかったねここからは実例を見ながら
awk
を見ていこう/etc/passwd
からmidori
ユーザの行を抜き出してみよう!awk '/^midori:/' /etc/passwd
/^midori:/
は { ... }
で囲われていないからパターンになるのかな?そのとおり!「 という意味になるよ
/ ... /
は正規表現の指定なんだ/^midori:/
でmidori:
で始まるレコードだけを処理」アクションを指定していない場合はレコードをそのまま表示するので
grep
と同じような動きになるよmidori:x:1001:1001:Midori Wakagi:/home/midori:/bin/bash
でも
/etc/passwd
の区切り文字って :
だよね?そのことをちゃんと利用して操作するにはどうすればいいのかな?それは 「その文字」 2文字以上を指定すると正規表現になるんだ
-F
オプションで区切り文字を指定するよ-F
オプションで1文字を指定すると区切りを正規表現で指定できる?それは柔軟にテキストを扱えそうだね
-F
オプションを使って同じ動作をする awk
コマンドを書いてみよう!$0
がレコード全体$1
が1番目のフィールド$2
が2番目のフィールド…を意味するんだawk -F: '$1 == "midori"' /etc/passwd
区切り文字を「コロン( にして 1番目のフィールドが
:
)」midori
であるレコードを表示…実行して結果を確認してみるね!midori:x:1001:1001:Midori Wakagi:/home/midori:/bin/bash
今度は「アクション」を 書いてみよう
print
は引数の内容を表示してくれるんだawk -F: '{ print $1 }' /etc/passwd
今度は「パターン」が 書かれていないねということは全部の行が処理されるのかな
root
bin
...
shigeru
midori
あっ
sed
のときの例と同じになったね!全ての行から1番目のフィールドだけ抜き出して表示してくれたんだね!もちろん「パターン」と 「アクション」を 混ぜて使うこともできるよ
awk -F: '$1 == "midori" {print $1}' /etc/passwd
区切り文字を「コロン( にして 1番目のフィールドが
:
)」midori
であるレコードの1番目のフィールドを表示…って意味ね!midori
$1
はユーザ名なので抜き出してもあまり面白くないけど$1
の数字を別の数字に置き換えるなどの応用ができるよ今回は決まった構造を持った内容を処理するのが得意な
awk
を学んだよ!でも使いこなすのは大変そう…実は
awk
はスクリプト言語でもあるんだなのでプログラミングもできるんだよgrep
や sed
の動きを再現できたようにたいていの処理は実現できるよ