クリップボードにコピーしました!
文字列のawk

awkとsedを基礎から学ぶテキスト処理入門

updated: 2026/05/09 created: 2026/05/09

はじめに

LinuxやUnix環境でテキスト処理を効率化したいなら、awkとsedは欠かせないコマンドです。

awkとsedの基本構文を比較すると、sedは行単位の編集が得意で、awkは列や条件ごとの処理に強い特徴があります。

本記事では、LinuxやUnix環境で利用されるawkとsedの基本から実践的な使い方までをわかりやすく解説します。

参考:GNU awk
参考:GNU 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

仕組み

項目awksed
主な用途列単位の処理行単位の置換
基本構文awk '{ 処理 }' filesed '操作' 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.txtapple を含む行を検索して表示
sed -n '/apple/p' input.txtapple に一致した行のみを出力
awk '{print $1}' input.txt1列目のみ抽出して表示
sed -n '2p' input.txt2行目だけを表示

解説

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.txtERROR を含む行だけを抽出
sed 's/ERROR/[CRITICAL]/' input.txtERROR を文字列置換
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, ENDFSで区切り文字を設定し、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処理やログ解析へ進むと理解しやすくなります。

特にパイプやシェルスクリプトと組み合わせることで、自動化の幅が大きく広がります。

小さなサンプルで繰り返し試しながら、実践的に学習を進めることが重要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

©︎ 2025-2026 running terminal commands