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個以上のタブがデリミタになる。
 $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
人気記事ランキング
ウィキ募集バナー