4.2 sed・awk

Stream Editor and Pattern Scanning

sedはストリームエディタで置換・削除を、awkはパターン処理言語でフィールド操作を得意とする。

sed

sed処理フロー

図1: sedの処理フロー

# 置換(最初の1つ)
sed 's/old/new/' file.txt

# 置換(すべて)
sed 's/old/new/g' file.txt

# ファイルを直接編集
sed -i 's/old/new/g' file.txt

# 行削除(3行目)
sed '3d' file.txt

# パターンにマッチする行を削除
sed '/pattern/d' file.txt

# 特定行のみ置換(10行目)
sed '10s/old/new/' file.txt

# 範囲指定(5-10行目)
sed '5,10s/old/new/g' file.txt
コマンド 説明
s/old/new/ 置換 s/foo/bar/g
d 行削除 /^#/d
p 行印刷 -n '1,5p'

awk

awk処理構造

図2: awkのプログラム構造

# 特定フィールド出力(スペース区切り)
awk '{print $1}' file.txt

# 複数フィールド
awk '{print $1, $3}' file.txt

# 区切り文字指定(CSV)
awk -F',' '{print $2}' data.csv

# コロン区切り(/etc/passwd)
awk -F':' '{print $1, $7}' /etc/passwd

# 条件付き
awk '$3 > 100 {print $1, $3}' data.txt

# 行番号とフィールド数
awk '{print NR, NF, $0}' file.txt

# 合計計算
awk '{sum += $1} END {print sum}' numbers.txt
変数 説明
$0 行全体
$1, $2... 1番目、2番目...のフィールド
NR 現在の行番号
NF フィールド数
FS フィールド区切り文字

その他のテキスト処理

# ソート
sort file.txt
sort -n file.txt      # 数値順
sort -r file.txt      # 逆順
sort -k2 file.txt     # 2番目のフィールドで

# 重複排除
sort file.txt | uniq
sort file.txt | uniq -c  # カウント付き

# 文字数・行数カウント
wc file.txt           # 行 単語 バイト
wc -l file.txt        # 行数のみ

# 列の抽出(cut)
cut -d',' -f1,3 data.csv
cut -c1-10 file.txt   # 1-10文字目
出典
[1] man sed - stream editor.
[2] man awk - pattern scanning and processing language.
[3] Aho, Kernighan, Weinberger. The AWK Programming Language.