naobe @ ウィキ
awk
最終更新:
Bot(ページ名リンク)
-
view
Linuxに戻る
簡単な使い方
/etc/passwdファイルのmailを含むユーザのユーザ、パスワードを標準出力へ出力
$ cat /etc/passwd | awk -F: '/mail/{print $1 "," $2}' mail,x mailnull,x
-Fでデリミタ指定。/mail/は検索パターン。{print $1 "," $2}で1列と2列を','で区切って出力。cutコマンドより柔軟。
以下も結果は同じ。デリミタは正規表現。"\t+"とすると、1個以上のタブがデリミタになる。
以下も結果は同じ。デリミタは正規表現。"\t+"とすると、1個以上のタブがデリミタになる。
$cat /etc/passwd | awk 'BEGIN{FS=":"} /mail/{print $1 "," $2}'
連続したブランクをデリミタとした例。出力列を","で区切ると、空白で分割した出力になる。
$echo "1 2 3" | awk 'BEGIN{FS=" +"} {print $3,$2,$1}' 3 2 1
ゼロ埋め
echo 1 | awk '{printf "%03d", $1}'
substr関数
typesetはkshでのローカル変数定義。引数1に文字列を入れて、開始位置、終了位置を設定し、返却変数を指定して実行すると、返却変数に結果が返る。awkに外から変数を与えるには、スクリプトのあとに変数名=値を追加する。
# # 位置指定文字抽出 # # $1 ターゲット # $2 開始位置(0から始まる) # $3 終了位置(0から始まる。この位置の文字は含まない) # $4 返却変数名 # function substr { typeset target start end retvar ret target=$1 start=$2 end=$3 retvar=$4 ret=`echo $target | awk '{print substr($0, start + 1, end - start )}' "start=$start" "end=$end "` eval "$retvar=\"$ret\"" } substr "12345" 1 4 ans echo $ans
グローバル正規表現置換
gsub(r, s, t)を使うとグローバルな(一致箇所はすべて)置換を行う。rは正規表現。sは置換文字列。tは対象文字列。tを省略すると$0を代わりに使う。
# # グローバル正規表現置換 # # $1 ターゲット文字列 # $2 正規表現 # $3 置換文字列 # $4 返却変数名 # function regreplace { typeset target regexp replace retvar ret target=$1 regexp=$2 replace=$3 retvar=$4 ret=`echo $target | awk '{gsub(regexp, replace); print }' "regexp=$regexp" "replace=$replace"` eval "$retvar=\"$ret\"" } regreplace 'Kanagawa Prefecture Kawasaki City' 'Pre.+ ' 'Premire ' ans echo $ans