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"
}