sed & awk

正規表現

  • [0-9a-z?.,;:'"][.?!][^abc] - 3文字条件
  • grep "can[ no']t" sample - 否定文にマッチ
  • *$ - 行末の一つ以上の空白
  • ^... - 行の先頭にdot後に2文字,空白
  • ^ *$ - 空行を探すときに便利
  • ^.*$ - 行全体にマッチ

sed

  • s/CA/California/g
  • /Sebastopol/s/CA/California - アドレスにマッチする行に対してのみ処理
  • /Sebastopol!/s/CA/California - アドレスにマッチしない行に対してのみ処理
  • 1d - 1行目削除
  • $d - 最後の行を削除
  • /^$/d - 空行を削除
  • 1,3d - 1〜3行目まで削除
  • 1,/^$/d - 1行目から最初の空行まで削除
  • 2,$ - 2〜最後の行まで削除
  • s/AB/ABCD/2 - 2番目のABが置き換えられる
  • 's/(.)DELI(.)/\2:\1/' - DELIで区切られた2つの箇所を自在に置き換え

  • sed 'TS/i/PLUS' - TSにマッチした列の上に追加

  • sed 'TS/a/PLUS' - TSにマッチした列の下に追加
  • sed 'TS/c/PLUS' - TSにマッチした行全体を変更

  • y/abc/xyz/ - 変換各文字ごとで変換が行われる文字列ではない

  • 100q - 100行目まで読んで終了する
  • sed -n 1~3,+1p - 1~3のうち1+1の行数を表示する

awk

  • awkは入力駆動型
  • cat test.txt | awk '/^$/{print "this is blank"}' - 空白行のところだけ表示
  • cat test.txt | awk '/1/{print $1"this is blank"}' - 検索行に追加
  • echo a b z d | awk 'BEGIN { one = 1; two = 2 } {print $(one+two)}' - 列を足し算で表すことができる
  • BEGIN{FS=","} - BEGINルールの中でフィールドセパレータを定義することができる
  • cat test.txt | awk 'BEGIN{ FS = "," } { print $2,$1 }' - csv形式のファイルの1,2列目を入れ替える
  • FS="[',:\t]" - フィールドセパレータは複数定義することができる
  • cat test.txt | awk '/^$/{ print x++}' - 空行が来るたびにx++で表示
  • cat test.txt | awk '/^$/{++x} END{print x}' - 空行をカウントし、最後に表示
  • cat test.txt | awk 'BEGIN{FS=","} {total+=$1} END {print total}' - 1行目を加算して表示
  • cat test.txt | awk 'BEGIN{FS=","} {total+=$1} {++x} END {print total/x}' - 1行目の平均を表示
  • cat test.txt | awk 'BEGIN{FS=","} /[0-9]+/{total+=$1} /[0-9]+/{++x} END {print total/x}' - 数値行1列目の平均値
  • cat test.txt | awk 'BEGIN{FS=","} NF==5 {print}' - フィールド数が5の行を表示
  • cat test.txt | awk 'BEGIN{FS=","} BEGIN{state="[0-9]+"} $1~state {total1+=$1} $1~state {++x} $2~state {total2+=$2} $2~/[0-9]+/ {++y} END {print total1/x,total2/y}' - 1行目は一行目の数値列の平均 2行目
  • cat test.txt | awk 'BEGIN{FS=","} {printf("|%4s|%4s|%4s|%4s|\n",$1,$2,$3,$4)}' - csv方式のファイルを綺麗に整列して表示
  • cat test.txt | awk 'BEGIN{FS=","} {if(NF==3) {print $1} else {print $2}}' - 3列なら1列目表示,3列以外なら2列目表示
  • echo 2 5 | awk '{print $1^$2}'
  • cat test.txt | awk 'BEGIN{FS=","} {printf("%s,%s\n",toupper($2),$1)}'
  • cat test.txt | awk 'BEGIN{FS=","} {gsub(/d../,"DSA",$1)} {printf("%s,%s\n",$2,$1)}' - d..をDSAに置き換える
  • cat test.txt | awk 'BEGIN{FS=","} {split($0,a,",")} {for( i = 0; i < length(a); i++ )printf("%s",a[i])} {print '\n'}' - splitで分割を行いばらばらに列の文字を合成して表示
  • cat test.txt | awk 'BEGIN{FS=","} {test[i++]=match($1,/[0-9][0-9]++/)} {one[l++]=$1} END {for( v = 1; v < length(test); v++ )if( test[v] == 1 )printf("%s\n",one[v]) }' - マッチ列のみ表示

  • システム定義変数

 BEGIN : 最初
 END   : 最後
 FS : フィールドセパレータ
 RS : レコードセパレータ
 OFS : デフォルトのフィールド出力セパレータ
 ORS : デフォルトのレコード出力セパレータ
 NF  : フィールド数
 NR  : レコード数
 <  : より小さい
 <= : 以下
 == : 等しい
 != : 等しくない
 ~  : マッチする
 !~ : マッチしない

 || : OR
 && : AND
 !  : NOT
  • 関数
cos(x)
sin(x)
exp(x)
int(x)
log(x)
sqrt(x)
rand()
srand(x) - シードの設定
int(x) - 小数点以下の数を切り捨てる

gsub(r,s,t) - 文字列t中で正規表現rにマッチするものを全てsに置き換える、置き換えた数を返す
index(s,t) - 文字列tの部分文字列sの位置を返す
length(s) - 文字列sの長さを返す
match(s,r) - s中の正規表現rの先頭位置を返す
split(s,a,sep) - 文字列sをフィールドセパレータsepに基づいて配列aの要素に置き換える
sprintf("fmt",exp) - 文字列合成
sub(r,s,t) - 文字列t中で正規表現rに最初にマッチしたものをsに置き換える
substr(s,p,n) - 文字列s中の位置pを先頭とする最大長nの部分文字列を返す
tolower(s) - 大文字にして返す
toupper(s) - 小文字にして返す

参考資料

  • sed & awk プログラミング