ゴール
熟練のawk職人になりたいわけではないが、ワンライナーで簡単な処理ならかける程度を目指す
awkの基本を学ぶ
ドットインストールでawkの基本を復習
awk基礎学習
ゆるふわな用語説明
用語 | 説明 |
---|---|
NF 組込み変数 | Number of Fieldの略.フィールド数 |
NR 組込み変数 | Number of Recordの略? レコードの数.最初のレコードは1 |
FS 組込み変数 | Field Separatorの略? FSとして正規表現による指定も可能 |
BEGIN ブロック | 通常のブロックは行毎に実行されるが、BEGINは最初のみ実行される.初期化に使用 |
END ブロック | 最後に実行される。出力や最終結果の計算等に使用する |
正規表現 ブロック | 正規表現にマッチする行に対する処理を書きたい時に使用する |
ゆるふわな組込み関数説明
関数名 | 説明 |
---|---|
index(in, find) | 引数inの文字列からfindで指定した文字が現れる場所を返す(1文字目ば1なことに注意). ない場合は0を返す. |
length(string) | 文字列の長さを返す |
printf(fmt, item1, item2...) | Cのprintf的に使える.どこまで同じかは不明. |
substr(string, start, [,length]) | 指定した範囲の部分文字列を返す |
tolower(string) | 小文字に変換する |
toupper(string) | 大文字に変換する |
こういう時はどう書くか
セパレータを指定して処理したい
-Fでセパレータを指定
$awk -F ":" '{ print $1 " " $3 }' /etc/passwd
各フィールドをループしたい
$awk '{for (i = 1; i <= NF; i++) print $i;}' data.txt
複数の記号をセパレータとして使用したい
- 正規表現を使用するとできる
- 以下はスペースと:と/を区切り文字として使用した場合の例
$ echo "2014/03/08 12:12:12" | \\
awk -F'[ :/]' '{print $2}'
特定の正規表現のパターンにマッチする行だけ処理する
$awk -F':' '$0 ~ /root/{ print}' /etc/passwd
文字列を数値に変換する
- 特に何もする必要がない。数値を表した文字列は数値に自動的に変換される。
$echo | awk '{ x="1.01"; x=x+1; print x}'
2.01
部分文字列を作成する
$echo 'abcde' | awk '{print substr($0, 2)}'
特定の制御文字でフィールドを区切る
- 下の例では^Aの部分が制御文字
- ^Aの場合はCtrl+v Ctrl+Aでターミナル上から入力できる
$more control_code.txt
a^Ab
$awk -F'^A' '{print $1 ":" $2}' control_code.txt
a:b
- バイナリの値を以下のように指定する事もできるっぽい
- 値は参考URLの制御コード表が参考になる
$awk -F'\01' '{print $1 ":" $2}' control_code.txt
a:b
引用元/参考URL
USP MAGAZINEコラボレーション連載/「シェル芸」に効く AWK処方箋
http://codezine.jp/article/corner/516
共通テーマ: 実例でわかる awk: 第 1 回
http://www.ibm.com/developerworks/jp/linux/library/l-awk1/
制御コード表
http://ash.jp/code/ctrltbl.htm
9.1 Built-in Functions - The GNU Awk User’s Guide
http://www.gnu.org/software/gawk/manual/gawk.html#Functions