Lから始まるLinux

2章56話
sedコマンド
2章57話 awkコマンド
もくじ
2章58話
テキスト関連コマンド(その1)
awk コマンド
若木 みどり
今、お兄ちゃんから 正規表現を使った コマンドを学んでいるよ! これまでで grep sed を学んだんだ!
若木 しげる
今回は awk 学んでいこう!
使い方
若木 しげる
awk 決まった構造を持った内容を 処理するのが得意なコマンドだよ awk は制作者3名の頭文字で 特定の意味を持った 単語ではないんだ
awk [オプション]... 'パターン {アクション}' [ファイル]
オプション役割
-F 文字列指定された文字列をフィールド区切り文字にする
若木 みどり
構造を持った内容…例えば今まで扱ったような/etc/passwd のようなものかな?
若木 しげる
そうだね後で /etc/passwd扱ってみよう!
レコードとフィールド
若木 しげる
読み込む内容の単位を「レコード(record)」と呼ぶんだデフォルトでは1行が「レコード」となるよ
若木 みどり
基本的には1行ずつ読み込んでその内容を解析していくんだね
若木 しげる
レコードは「フィールドセパレータ(field separator, FS)」という区切り文字で区切られていてその区切られた要素を「フィールド」と呼ぶよデフォルトではスペースやタブなど空白文字がフィールドセパレータになっているんだ
若木 みどり
「レコード」「フィールド」と呼ばれる要素で構成されていると解釈してくれるんだ
パターンとアクション
若木 しげる
awk の操作は「パターン(pattern)」「アクション(action)」で指定するよ
若木 しげる
「パターン」は処理対象のレコードの指定で指定が無ければ全ての行で処理をしてくれるんだ
若木 みどり
指定すれば一部のレコードだけに処理を絞れるんだね!
若木 しげる
「アクション」処理内容で指定がなければレコードを表示してくれるんだ
実例
若木 しげる
定義ばかりで難しかったねここからは実例を見ながら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文字を指定すると「その文字」2文字以上を指定すると正規表現になるんだ
若木 みどり
区切りを正規表現で指定できる?それは柔軟にテキストを扱えそうだね
若木 しげる
-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 はスクリプト言語でもあるんだなのでプログラミングもできるんだよgrepsed の動きを再現できたようにたいていの処理は実現できるよ