はじめに
LinuxやUnix環境でテキスト処理を効率化したいなら、awkとsedは欠かせないコマンドです。
awkとsedの基本構文を比較すると、sedは行単位の編集が得意で、awkは列や条件ごとの処理に強い特徴があります。
本記事では、LinuxやUnix環境で利用されるawkとsedの基本から実践的な使い方までをわかりやすく解説します。
awkとsedの基本構文を比較
ファイル作成
cat << 'EOF' > input.txt
apple 100
banana 200
orange 300
EOF
実行コマンド
awk '{ print $1, $2 }' input.txt
実行結果
apple 100
banana 200
orange 300
実行コマンド
sed 's/ / : /' input.txt
実行結果
apple : 100
banana : 200
orange : 300
仕組み
| 項目 | awk | sed |
|---|---|---|
| 主な用途 | 列単位の処理 | 行単位の置換 |
| 基本構文 | awk '{ 処理 }' file | sed '操作' file |
| データ処理 | フィールド操作が得意 | 文字列変換が得意 |
| 区切り文字 | 空白を自動認識 | 正規表現で処理 |
| 代表例 | $1, $2で列参照 | s/old/new/で置換 |
解説
awkはフィールド単位で柔軟にデータを扱えるため、CSVやログ解析に向いています。
sedは文字列置換を高速に行えるため、設定ファイル編集や一括変換でよく利用されます。
awkとsedで文字列を検索・抽出する方法
ファイル作成
cat << 'EOF' > input.txt
apple red
banana yellow
grape purple
apple green
orange orange
EOF
実行コマンド
awk '/apple/' input.txt
実行結果
apple red
apple green
実行コマンド
sed -n '/apple/p' input.txt
実行結果
apple red
apple green
実行コマンド
awk '{print $1}' input.txt
実行結果
apple
banana
grape
apple
orange
実行コマンド
sed -n '2p' input.txt
実行結果
banana yellow
仕組み
| コマンド | 仕組み |
|---|---|
| awk '/apple/' input.txt | apple を含む行を検索して表示 |
| sed -n '/apple/p' input.txt | apple に一致した行のみを出力 |
| awk '{print $1}' input.txt | 1列目のみ抽出して表示 |
| sed -n '2p' input.txt | 2行目だけを表示 |
解説
awkは列単位の抽出や条件処理が得意です。
sedは行単位の検索・置換・抽出をシンプルに実行できます。
awkとsedで特定の行を削除・フィルタリングする方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
banana
melon
EOF
実行コマンド
sed '/banana/d' input.txt
実行結果
apple
orange
grape
melon
実行コマンド
awk '!/banana/' input.txt
実行結果
apple
orange
grape
melon
実行コマンド
sed '2d' input.txt
実行結果
apple
orange
grape
banana
melon
実行コマンド
awk 'NR!=2' input.txt
実行結果
apple
orange
grape
banana
melon
仕組み
| コマンド | 仕組み |
|---|---|
| sed '/banana/d' | bananaに一致した行を削除する |
| awk '!/banana/' | bananaに一致しない行だけ表示する |
| sed '2d' | 2行目を削除する |
| awk 'NR!=2' | 行番号(NR)が2以外を表示する |
解説
sedは行編集に特化したストリームエディタで、簡潔に削除処理を書けます。
awkは条件分岐や列処理も得意なため、複雑なフィルタリングに向いています。
awkとsedで文字列を置換する方法と使い分け
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
apple grape orange
banana apple melon
EOF
実行コマンド
sed 's/apple/APPLE/g' input.txt
実行結果
APPLE orange banana
APPLE grape orange
banana APPLE melon
実行コマンド
awk '{gsub(/orange/,"ORANGE"); print}' input.txt
実行結果
apple ORANGE banana
apple grape ORANGE
banana apple melon
仕組み
| コマンド | 用途 | 特徴 | 向いているケース |
|---|---|---|---|
| sed | 文字列置換 | ストリーム編集が得意 | 単純な一括置換 |
| awk | パターン処理 | 列操作や条件分岐が可能 | 複雑な加工や抽出 |
解説
sedはシンプルな文字列置換を高速に実行できるため、ログ編集などに向いています。
awkはフィールド単位の処理や条件付き変換が可能で、データ加工に強力です。
awkとsedで正規表現を使ったパターンマッチングの方法
ファイル作成
cat << 'EOF' > input.txt
apple 100
banana 200
grape 300
pineapple 400
orange 500
EOF
実行コマンド
awk '/apple/ {print $1, $2}' input.txt
実行結果
apple 100
pineapple 400
実行コマンド
sed -n '/apple/p' input.txt
実行結果
apple 100
pineapple 400
実行コマンド
awk '/^a/ {print $1}' input.txt
実行結果
apple
実行コマンド
sed -n '/^a/p' input.txt
実行結果
apple 100
仕組み
| コマンド | 仕組み | 内容 |
|---|---|---|
| awk '/apple/' | 正規表現で行検索 | appleを含む行を抽出 |
| sed -n '/apple/p' | パターン一致で表示 | appleを含む行を出力 |
| awk '/^a/' | ^で先頭一致 | aから始まる文字列を検索 |
| sed -n '/^a/p' | 行頭マッチ | a始まりの行を表示 |
解説
awkは条件に一致したデータを列単位で処理でき、sedは行単位の置換や抽出に適しています。
どちらも正規表現を利用することで柔軟なテキスト処理が可能です。
awkとsedで複数条件を指定して処理する方法
ファイル作成
cat << 'EOF' > input.txt
Alice 85 Tokyo
Bob 72 Osaka
Charlie 90 Tokyo
David 68 Nagoya
Eve 88 Osaka
Frank 95 Tokyo
EOF
実行コマンド
awk '$2 >= 80 && $3 == "Tokyo"' input.txt
実行結果
Alice 85 Tokyo
Charlie 90 Tokyo
Frank 95 Tokyo
実行コマンド
awk '$2 < 80 || $3 == "Osaka"' input.txt
実行結果
Bob 72 Osaka
David 68 Nagoya
Eve 88 Osaka
実行コマンド
sed -n '/Tokyo/p' input.txt | sed -n '/8[5-9]/p;/9[0-9]/p'
実行結果
Alice 85 Tokyo
Charlie 90 Tokyo
Frank 95 Tokyo
実行コマンド
sed -n '/Osaka/p;/Nagoya/p' input.txt
実行結果
Bob 72 Osaka
David 68 Nagoya
Eve 88 Osaka
仕組み
| コマンド | 条件 | 仕組み |
|---|---|---|
| awk '$2 >= 80 && $3 == "Tokyo"' | AND条件 | 2列目が80以上、かつ3列目がTokyoの行を抽出 |
| awk '$2 < 80 || $3 == "Osaka"' | OR条件 | 2列目が80未満、または3列目がOsakaの行を抽出 |
| sed -n '/Tokyo/p' | sed -n '/8[5-9]/p;/9[0-9]/p' | 複数条件 | 1段目でTokyoを抽出し、2段目で85〜99点を抽出 |
| sed -n '/Osaka/p;/Nagoya/p' | OR条件 | OsakaまたはNagoyaを含む行を表示 |
解説
awkは列単位で条件判定できるため、数値比較や文字列比較を簡潔に記述できます。
sedはパイプを活用して段階的に絞り込むことで、柔軟なテキスト処理を実現できます。
awkとsedで区切り文字を指定してCSV・TSVを処理する方法
ファイル作成
cat << 'EOF' > input.txt
id,name,department,salary
1,Alice,Sales,5000
2,Bob,Engineering,7000
3,Charlie,HR,4500
EOF
ファイル作成
cat << 'EOF' > input2.txt
id name department salary
1 Alice Sales 5000
2 Bob Engineering 7000
3 Charlie HR 4500
EOF
実行コマンド
awk -F',' '{print $2, $3}' input.txt
実行結果
name department
Alice Sales
Bob Engineering
Charlie HR
実行コマンド
awk -F'\t' '{print $2, $4}' input2.txt
実行結果
name salary
Alice 5000
Bob 7000
Charlie 4500
実行コマンド
sed 's/,/ - /g' input.txt
実行結果
id - name - department - salary
1 - Alice - Sales - 5000
2 - Bob - Engineering - 7000
3 - Charlie - HR - 4500
実行コマンド
sed 's/\t/ - /g' input2.txt
実行結果
id - name - department - salary
1 - Alice - Sales - 5000
2 - Bob - Engineering - 7000
3 - Charlie - HR - 4500
仕組み
| コマンド | 仕組み |
|---|---|
| awk -F',' '{print $2, $3}' | -F','でCSVの区切り文字を,に設定し、2列目と3列目を出力 |
| awk -F'\t' '{print $2, $4}' | -F'\t'でTSVの区切り文字をタブに設定し、2列目と4列目を取得 |
| sed 's/,/ - /g' | s/検索文字列/置換文字列/gで,を全て-へ置換 |
| sed 's/\t/ - /g' | タブ文字\tを-へ一括変換して表示 |
解説
awkは列単位の抽出や集計に強く、sedは文字列置換に適しています。
CSV・TSVでは区切り文字を適切に指定することで柔軟にデータ処理できます。
awkとsedでファイルを直接編集・上書きする方法
ファイル作成
cat << 'EOF' > input.txt
apple 100
banana 200
orange 300
EOF
実行コマンド
awk '{ $2=$2*2; print }' input.txt > tmp.txt && mv tmp.txt input.txt
cat input.txt
実行結果
apple 200
banana 400
orange 600
実行コマンド
sed -i '' 's/200/999/' input.txt
cat input.txt
実行結果
apple 999
banana 400
orange 600
仕組み
| コマンド | 仕組み | 特徴 |
|---|---|---|
| awk | 処理結果を一時ファイルへ出力後、mvで元ファイルを置換 | 柔軟な列編集や計算が可能 |
| sed -i '' | -i オプションで直接ファイルを書き換え | 文字列置換を簡潔に実行可能 |
解説
awkはフィールド単位の加工や計算に強く、sedは文字列置換を高速に行う用途に向いています。
どちらもシェルスクリプトで頻繁に利用される定番コマンドです
awkとsedを組み合わせてログファイルを解析する方法
ファイル作成
cat << 'EOF' > input.txt
2026-05-08 10:00:01 INFO User login success
2026-05-08 10:01:15 ERROR Database connection failed
2026-05-08 10:02:20 INFO File uploaded
2026-05-08 10:03:45 WARN Disk usage 85%
2026-05-08 10:04:12 ERROR Timeout while processing request
EOF
実行コマンド
awk '/ERROR/' input.txt
実行結果
2026-05-08 10:01:15 ERROR Database connection failed
2026-05-08 10:04:12 ERROR Timeout while processing request
実行コマンド
sed 's/ERROR/[CRITICAL]/' input.txt
実行結果
2026-05-08 10:00:01 INFO User login success
2026-05-08 10:01:15 [CRITICAL] Database connection failed
2026-05-08 10:02:20 INFO File uploaded
2026-05-08 10:03:45 WARN Disk usage 85%
2026-05-08 10:04:12 [CRITICAL] Timeout while processing request
実行コマンド
awk '/ERROR/' input.txt | sed 's/ERROR/[CRITICAL]/'
実行結果
2026-05-08 10:01:15 [CRITICAL] Database connection failed
2026-05-08 10:04:12 [CRITICAL] Timeout while processing request
仕組み
| コマンド | 仕組み |
|---|---|
| awk '/ERROR/' input.txt | ERROR を含む行だけを抽出 |
| sed 's/ERROR/[CRITICAL]/' input.txt | ERROR を文字列置換 |
| awk … | sed … | 抽出結果をさらに加工 |
解説
awk はログの抽出や条件検索に強く、sed は文字列変換に便利です。
組み合わせることで、ログ解析と整形を効率よく自動化できます。
awkとsedでパイプを活用した実践的なテキスト処理
ファイル作成
cat << 'EOF' > input.txt
2026-05-01 INFO user=alice action=login
2026-05-01 ERROR user=bob action=failed_login
2026-05-02 INFO user=carol action=upload
2026-05-02 ERROR user=dave action=timeout
2026-05-03 INFO user=alice action=logout
EOF
実行コマンド
cat input.txt | awk '$2=="ERROR"' | sed 's/action=/status=/'
実行結果
2026-05-01 ERROR user=bob status=failed_login
2026-05-02 ERROR user=dave status=timeout
実行コマンド
cat input.txt | awk '{print $3}' | sed 's/user=//'
実行結果
alice
bob
carol
dave
alice
実行コマンド
cat input.txt | awk '$2=="INFO" {print $1, $4}' | sed 's/action=//'
実行結果
2026-05-01 login
2026-05-02 upload
2026-05-03 logout
仕組み
| コマンド | awkの役割 | sedの役割 | パイプ(|)の役割 |
|---|---|---|---|
| awk '$2=="ERROR"' | ERROR行を抽出 | action=をstatus=へ置換 | awkの結果をsedへ渡す |
| awk '{print $3}' | 3列目(user情報)を抽出 | user=を削除 | テキスト整形を連携 |
| awk '$2=="INFO" {print $1, $4}' | 日付とaction列を抽出 | action=を削除 | 抽出結果を加工 |
解説
awkは列単位の抽出や条件分岐に強く、sedは文字列置換や整形に適しています。
パイプを組み合わせることで、ログ解析やCSV加工などを効率的に実行できます。
awkとsedで複数ファイルを一括処理する方法
ファイル作成
cat << 'EOF' > file1.txt
apple 100
banana 200
orange 300
EOF
ファイル作成
cat << 'EOF' > file2.txt
apple 150
banana 250
orange 350
EOF
ファイル作成
cat << 'EOF' > file3.txt
apple 180
banana 280
orange 380
EOF
実行コマンド
awk '{sum += $2} END {print FILENAME " 合計=" sum}' file*.txt
実行結果
file3.txt 合計=2190
実行コマンド
awk '{print FILENAME, $1, $2 * 1.1}' file*.txt
実行結果
file1.txt apple 110
file1.txt banana 220
file1.txt orange 330
file2.txt apple 165
file2.txt banana 275
file2.txt orange 385
file3.txt apple 198
file3.txt banana 308
file3.txt orange 418
実行コマンド
sed 's/apple/grape/g' file*.txt
実行結果
grape 100
banana 200
orange 300
grape 150
banana 250
orange 350
grape 180
banana 280
orange 380
実行コマンド
sed -n '/banana/p' file*.txt
実行結果
banana 200
banana 250
banana 280
仕組み
| コマンド | 仕組み |
|---|---|
| awk '{sum += $2} END {print FILENAME " 合計=" sum}' file*.txt | 全ファイルの2列目を加算し、最後に合計を表示 |
| awk '{print FILENAME, $1, $2 * 1.1}' file*.txt | ファイル名付きで値を加工して出力 |
| sed 's/apple/grape/g' file*.txt | 複数ファイルの内容を置換して標準出力へ表示 |
| sed -n '/banana/p' file*.txt | 条件に一致した行だけを抽出 |
解説
awk は列単位の集計や計算に強く、sed は文字列置換や行抽出に適しています。
ワイルドカード file*.txt を使うことで複数ファイルを一括処理できます。
awkとsedの組み込み変数・アドレス指定
ファイル作成
cat << 'EOF' > input.txt
apple 100
orange 200
banana 300
grape 400
melon 500
EOF
実行コマンド
awk 'BEGIN{FS=" "} {print NR ":" $1 "," $2} END{print "total=" NR}' input.txt
実行結果
1:apple,100
2:orange,200
3:banana,300
4:grape,400
5:melon,500
total=5
実行コマンド
awk '$2 >= 300 {print FNR ":" $1}' input.txt
実行結果
3:banana
4:grape
5:melon
実行コマンド
sed -n '2,4p' input.txt
実行結果
orange 200
banana 300
grape 400
実行コマンド
sed -n '/banana/,/melon/p' input.txt
実行結果
banana 300
grape 400
melon 500
仕組み
| コマンド | 組み込み変数・アドレス指定 | 仕組み |
|---|---|---|
| awk 'BEGIN{FS=" "} ...' | FS, NR, END | FSで区切り文字を設定し、NRで行番号を取得、ENDで最後に集計を実行 |
| awk '$2 >= 300 ...' | FNR, 条件式 | 2列目が300以上の行だけ抽出し、FNRでファイル内行番号を表示 |
| sed -n '2,4p' | 行アドレス | 2〜4行目だけを範囲指定して出力 |
| sed -n '/banana/,/melon/p' | パターンアドレス | bananaからmelonまで一致した範囲を出力 |
解説
awkは組み込み変数を利用することで、行番号や区切り文字を柔軟に扱えます。
sedは行番号や文字列パターンによるアドレス指定で、対象範囲を効率よく抽出できます。
awkとsedを使ったシェルスクリプト自動化テクニック
ファイル作成
cat << 'EOF' > input.txt
2026-05-01,Tanaka,Sales,120000
2026-05-02,Suzuki,Engineering,180000
2026-05-03,Sato,Sales,150000
2026-05-04,Takahashi,Marketing,130000
2026-05-05,Yamada,Engineering,210000
EOF
実行コマンド
awk -F',' '$3=="Engineering"{print $2 " : " $4}' input.txt
実行結果
Suzuki : 180000
Yamada : 210000
実行コマンド
sed 's/Sales/Business/g' input.txt
実行結果
2026-05-01,Tanaka,Business,120000
2026-05-02,Suzuki,Engineering,180000
2026-05-03,Sato,Business,150000
2026-05-04,Takahashi,Marketing,130000
2026-05-05,Yamada,Engineering,210000
実行コマンド
awk -F',' '{sum[$3]+=$4} END {for (d in sum) print d, sum[d]}' input.txt
実行結果
Marketing 130000
Sales 270000
Engineering 390000
実行コマンド
sed -n '2,4p' input.txt
実行結果
2026-05-02,Suzuki,Engineering,180000
2026-05-03,Sato,Sales,150000
2026-05-04,Takahashi,Marketing,130000
仕組み
| コマンド | 仕組み | 用途 |
|---|---|---|
| awk -F',' | カンマ区切りで列を分割 | CSVデータ解析 |
| $3=="Engineering" | 3列目条件一致のみ抽出 | 条件フィルタ |
| sum[$3]+=$4 | 部署ごとに金額集計 | 集約処理 |
| sed 's/old/new/g' | 文字列を一括置換 | データ変換 |
| sed -n '2,4p' | 指定行のみ表示 | ログ抽出 |
解説
awkは列単位の分析や集計に強く、sedは文字列変換や行編集を高速に処理できます。
両方を組み合わせることで、シェルスクリプトによるログ解析やCSV自動処理を効率化できます。
awkとsedでデータ集計・整形を行うテクニック
ファイル作成
cat << 'EOF' > input.txt
2026-05-01,Tokyo,Alice,120
2026-05-01,Osaka,Bob,95
2026-05-02,Tokyo,Charlie,140
2026-05-02,Osaka,Alice,110
2026-05-03,Nagoya,Bob,130
2026-05-03,Tokyo,Alice,150
EOF
実行コマンド
awk -F',' '{sum[$2]+=$4} END {for (city in sum) print city, sum[city]}' input.txt
実行結果
Tokyo 410
Osaka 205
Nagoya 130
実行コマンド
awk -F',' '$4 >= 120 {print $1, $2, $3, $4}' input.txt
実行結果
2026-05-01 Tokyo Alice 120
2026-05-02 Tokyo Charlie 140
2026-05-03 Nagoya Bob 130
2026-05-03 Tokyo Alice 150
実行コマンド
sed 's/Tokyo/TOKYO/g' input.txt
実行結果
2026-05-01,TOKYO,Alice,120
2026-05-01,Osaka,Bob,95
2026-05-02,TOKYO,Charlie,140
2026-05-02,Osaka,Alice,110
2026-05-03,Nagoya,Bob,130
2026-05-03,TOKYO,Alice,150
実行コマンド
sed -n '2,4p' input.txt
実行結果
2026-05-01,Osaka,Bob,95
2026-05-02,Tokyo,Charlie,140
2026-05-02,Osaka,Alice,110
仕組み
| コマンド | 仕組み |
|---|---|
| awk -F',' '{sum[$2]+=$4}' | 2列目をキーにして4列目の数値を合計 |
| awk '$4 >= 120' | 条件一致した行のみ抽出 |
| sed 's/Tokyo/TOKYO/g' | 文字列を一括置換 |
| sed -n '2,4p' | 指定した行範囲だけ表示 |
解説
awkは列単位の集計や条件抽出に強く、ログ解析やCSV処理で活躍します。
sedはテキスト置換や行編集を高速に行えるため、前処理や整形に便利です。
awkとsedのスクリプトファイル化
ファイル作成
cat << 'EOF' > input.txt
orange 100
apple 200
banana 150
grape 300
EOF
ファイル作成
cat << 'EOF' > sample.awk
{
print $1 ":" $2
}
EOF
ファイル作成
cat << 'EOF' > sample.sed
s/banana/melon/g
EOF
実行コマンド
awk -f sample.awk input.txt
実行結果
orange:100
apple:200
banana:150
grape:300
実行コマンド
sed -f sample.sed input.txt
実行結果
orange 100
apple 200
melon 150
grape 300
仕組み
| コマンド | 仕組み |
|---|---|
| awk -f sample.awk input.txt | -fでawkスクリプトファイルを読み込み、各行をフィールド単位で処理する |
| sed -f sample.sed input.txt | -fでsedスクリプトファイルを読み込み、置換処理を自動適用する |
解説
awkはフィールド単位の加工に強く、列データの整形に適しています。
sedは文字列置換や行編集を簡潔に実行できるため、ログ加工などで活用されます。
awkとsedを使いこなすための学習ポイントまとめ
awkとsedは、テキスト処理を効率化する代表的なコマンドです。
初学者はまず基本構文と正規表現に慣れ、その後にCSV処理やログ解析へ進むと理解しやすくなります。
特にパイプやシェルスクリプトと組み合わせることで、自動化の幅が大きく広がります。
小さなサンプルで繰り返し試しながら、実践的に学習を進めることが重要です。
