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) - 小文字にして返す