4.2 sed・awk
Stream Editor and Pattern Scanning
sedはストリームエディタで置換・削除を、awkはパターン処理言語でフィールド操作を得意とする。
sed
@startuml !theme plain skinparam backgroundColor #FEFEFE rectangle "入力" as Input rectangle "パターンスペース" as Pattern #DBEAFE rectangle "コマンド実行\n(s/old/new/)" as Command rectangle "出力" as Output Input --> Pattern : 1行読み込み Pattern --> Command : コマンド適用 Command --> Output : 結果出力 Output --> Pattern : 次の行へ note right of Command s : 置換 d : 削除 p : 印刷 a : 追加 i : 挿入 end note @enduml
図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
@startuml !theme plain skinparam backgroundColor #FEFEFE rectangle "BEGIN ブロック\n初期化処理" as Begin #FEF3C7 rectangle "メインブロック\n各行に対して実行" as Main #DBEAFE rectangle "END ブロック\n終了処理" as End #D1FAE5 Begin --> Main : 開始 Main --> Main : 次の行 Main --> End : 全行処理後 note right of Main $0 : 行全体 $1, $2... : フィールド NR : 行番号 NF : フィールド数 FS : 区切り文字 end note @enduml
図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.
[2] man awk - pattern scanning and processing language.
[3] Aho, Kernighan, Weinberger. The AWK Programming Language.