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 の区切り文字って : だよね?区切り文字をちゃんと利用して操作してみたいのだけどどうすればいいのかな?それは
-F オプションで区切り文字を指定するよ-F オプションで1文字を指定すると区切りを正規表現で指定できる?それは柔軟にテキストを扱えそうだね
-F オプションを使って同じ動作をする awk コマンドを書いてみよう!awk -F: '$1 == "midori"' /etc/passwd
$0 がレコード全体$1 が1番目のフィールド$2 が2番目のフィールド…を意味するんだ区切り文字を「コロン( にして 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 の動きを再現できたようにたいていの処理は実現できるんだ