Skip to main content

sed and awk

簡単な使い方の例を記載する。

sed

2行目以降で、fooをbarに全て置換

sed -e '2,$ s/foo/bar/g' filename

20行目の次に「(タブ)added text」を追加、10行目を削除

sed -e '20i\\tadded text' -e '10d' filename

exprを含まない行だけ表示

sed -ne '/expr/! p' filename

後方参照

df /tmp | grep ^/ | awk '{print $5}' | sed -e 's/\([0-9]\{1,2\}\)%/\1/'

df /tmp | sed -ne 's/.* \([0-9]\{1,2\}\)% .*/\1/ p'

replace CR + LF to LF

sed  -e  's/\r$//' -i.bak textfile
perl -pe 's/\r$//' -i.bak textfile

replace LF to CR + LF

sed  -e  's/$/\r/' -i.bak textfile
perl -pe 's/$/\r/' -i.bak textfile

連続した空白文字をタブに置換

sed  -e   's/\s\s*/\t/g' test
perl -ple 's/\s+/,/g'    test

置換先文字列としてシェル変数を使う。

sed  -e 's/^/'"${foo}"'/' test

削除、挿入、置換を実行するsedスクリプトの例

#! /bin/sed -f

3,5d
8i \
# inserted comment\
inserted line # this is inserted
20 s/^/#/

awk

2行目から3行目までを表示

awk '(NR>=2 && NR<=3) {print $0}' filename

行番号を表示

awk '{printf "%02d: %s\n", NR, $0}' filename

IPv4アドレスの第1オクテットが192のものの第2オクテットを抜き出す

awk -F. '$1~/192/ {print $2}' filename
perl -F"\." -alne '{print $F[1]}' filename

コマンドにシェル変数を使う。

awk '{print '"${foo}"', $1}' test
(fooが2017-08のような文字列だと、数値として扱われて演算結果が表示される)

awk -v var=${foo} '{print var, $1}' test
(こちらの例では、そのようなことはない)

スクリプトファイルにコマンドを記載して実行

awk -f script.awk textfile

下記の場合、shebangとして、#! /path/to/awk -f などと記載

chmod u+x script.awk
./script.awk textfile

行頭に2桁の行番号をつけて出力するawkスクリプト

#! /bin/awk -f

BEGIN{
  print "script begin"
}
{
  printf "%02d: %s\n", NR,$0
}
END {
  print "script end"
}