ざる魂

真似ぶ魂、学ぶの本質。知られざる我が魂

ちょい足しawkの基本

基本

コンマンドラインでちょい足し的に使うときのカンペ。

$ awk '[BEGIN {各行を処理する前の処理}] [パターン] {各行の処理} [END {各行を処理した後の処理}]'
  • BEGIEN, END, パターンは省略できる("[]"でくくったもの)
  • 例は以下。アクセスログのステータスコードが200のものを出力
awk '$4 == "200" {print $4,$5}'# $4が200のとき、$4,$5を表示
awk '$4 != "200" { print }'   # $4が200でないとき、1行まるごと表示
awk '$4 ~ /200/ { print }'    # $4が200のとき、1行まるごと表示(正規表現)
awk '$1 ~ /^a/ { print}'      # $1が"a"で始まるとき、表示(正規表現)
awk '$1 !~ /^a/{ print}'      # $1が"a"以外で始まるとき、表示(正規表現)

(例)

$ cat access.log | awk '$4 = "200" {print $5$6}' | sed 's/\"//g'

デリミタを変更するには

Fオプションを使用する。カンマの場合は以下のとおり。

cat access.log | awk -F , '$4 = "200" {print $5$6}' | sed 's/\"//g'

マッチした文字列だけを表示

文字列の中から数字部分を取りだす場合は以下のとおり。

$ gawk '{print gensub(/(.*)([0-9]+)(.*)/,"\\2","")}'
  • gensubのgenは汎用からきている。

    • 第1引数:正規表現
    • 第2引数:置換文字列。ここでは後方参照の2番目として「\\2」を指定している。
    • 第3引数:g/Gを指定した場合、マッチするすべてを置換する。それ以外の場合は最初だけ置換する。

マッチしたい部分とさせたくない部分を正規表現でグルーピングし、 マッチしたグループだけで後方参照で置換することで、 マッチさせた文字列だけを表示できる。

タブを出力する例

整形する際、区切り文字としてタブを出力したい場合の例。

$ cat hoge.txt |awk '{print $1"\t"$2}'