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
