
Linuxコマンドラインの世界へようこそ!データ処理と自動化の現場で、あなたは「もっとスマートに、もっと効率的に」という壁にぶつかったことはありませんか?
大量のログファイルから特定の情報を抽出し、整形し、レポートを作成する。あるいは、CSVデータを特定の条件で加工し、別のシステムに渡す。そんな時、単なるパイプだけでは物足りなさを感じるかもしれません。
そこで登場するのが、awk
とsed
です。これらは、Linuxコマンドラインにおけるテキスト処理の「二刀流」。
一見すると難解に見えるかもしれませんが、一度理解すれば、あなたのデータ加工スキルは飛躍的に向上し、パイプラインの可能性を広げることができます。
この記事では、awk
とsed
のそれぞれの得意分野を明確にし、パイプライン内でどのように連携させることで、より高度なテキスト処理が可能になるかを具体的な例で示します。
特に、正規表現の活用に重点を置き、あなたの「データ加工の悩み」を「データ加工の喜び」に変えるための実践的な知識とテクニックを伝授します。さあ、私たちと一緒に、テキスト処理の新たな扉を開きましょう!
目次
- なぜ
awk
とsed
がパイプラインで強力なのか sed
コマンド詳解:ストリームエディタの基本と応用- 置換、削除、挿入の基本
- 正規表現を使ったパターンマッチング
- 複数コマンドの連結とスクリプトファイル
awk
コマンド詳解:データ処理の万能ツール- フィールド処理とパターンアクション
- 変数、条件分岐、ループ
- レポート生成と集計処理
awk
とsed
を組み合わせた実践例- 複雑なログデータの解析と整形
- CSV/TSVデータの加工
- まとめと次のステップ
対象読者
- Linuxパイプの基本的な概念を理解しており、
xargs
やtee
などの応用コマンドも使いこなせる開発者 - より複雑なテキストデータの抽出、整形、集計を効率的に行いたい運用エンジニア
- シェルスクリプトにおけるデータ加工のスキルを極めたいと考えている方
なぜawk
とsed
がパイプラインで強力なのか
Linuxのパイプ(|
)は、コマンドの出力を別のコマンドの入力に繋ぐことで、一連の処理を効率的に実行する強力なメカニズムです。
しかし、パイプだけでは「行の置換」「特定の列の抽出」「条件に基づいたデータ整形」といった、より複雑なテキスト加工には限界があります。
ここでawk
とsed
の出番です!
これらは、それぞれ異なるアプローチでテキストデータを操作する専門ツールであり、パイプラインに組み込むことで、その能力を最大限に引き出すことができます。
sed
は「ストリームエディタ」として、テキストの置換や削除、挿入といった編集作業に特化しています。
一方、awk
は「パターン走査・処理言語」として、行をフィールドに分割し、条件に基づいて処理を行うデータ抽出・整形に優れています。
この二つのツールをパイプラインで連携させることで、まるで熟練の職人が道具を使い分けるように、複雑なデータ加工タスクを柔軟かつ効率的にこなすことが可能になります。
sed
コマンド詳解:ストリームエディタの基本と応用
sed
(Stream EDitor)は、テキストストリーム(ファイルや標準入力)を一行ずつ読み込み、指定された編集コマンドを適用して標準出力に結果を出力する非対話型エディタです。
元のファイルを直接変更しないため、安全に試行錯誤できます。
置換、削除、挿入の基本
sed
の最も基本的な使い方は、文字列の置換です。s/old/new/
の形式で記述します。
サンプルデータの準備
まず、以下の内容で sed_sample.txt
ファイルを作成します。
cat << 'EOF' > sed_sample.txt
Hello world
This is a test line with error.
Another line.
EOF
実行手順と期待される結果
1. 文字列の置換
echo "Hello world" | sed 's/world/Linux/'
期待される実行結果:
Hello Linux
2. ファイル内の全ての文字列を置換 (gオプション)
sed 's/error/warning/g' sed_sample.txt
期待される実行結果:
Hello world
This is a test line with warning.
Another line.
3. 行の削除
行の削除は d
コマンドを使います。
cat sed_sample.txt | sed '/test/d'
期待される実行結果:
Hello world
Another line.
4. 特定の行範囲を削除
cat sed_sample.txt | sed '1,2d'
期待される実行結果:
Another line.
5. 行の挿入
行の挿入は i
(insert) または a
(append) コマンドを使います。
echo -e "line1\nline2" | sed 'i\PREFIX: '
期待される実行結果:
PREFIX:
line1
PREFIX:
line2
6. 各行の後に文字列を追加
echo -e "line1\nline2" | sed 'a\SUFFIX'
期待される実行結果:
line1
SUFFIX
line2
SUFFIX
正規表現を使ったパターンマッチング
sed
は強力な正規表現をサポートしており、複雑なパターンマッチングと置換が可能です。
実行手順と期待される結果
1. 数字の連続を置換
echo "ID: 12345, Code: 67890" | sed 's/[0-9]\+/[NUMBER]/g'
期待される実行結果:
ID: [NUMBER], Code: [NUMBER]
2. 特定の文字列で始まる行の末尾に追記
echo "START line" | sed '/^START/s/$/ -- END/'
期待される実行結果:
START line -- END
複数コマンドの連結とスクリプトファイル
複数のsed
コマンドは ;
で連結するか、-e
オプションで複数指定できます。
サンプルデータの準備
まず、以下の内容で logfile.txt
と my_script.sed
ファイルを作成します。
cat << 'EOF' > logfile.txt
This is an error line.
This is a fail line.
This is a DEBUG line.
EOF
cat << 'EOF' > my_script.sed
s/error/warning/g
/DEBUG/d
EOF
実行手順と期待される結果
1. 複数コマンドの連結
sed -e 's/error/warning/g' -e 's/fail/issue/g' logfile.txt
期待される実行結果:
This is an warning line.
This is a issue line.
This is a DEBUG line.
2. スクリプトファイルの使用
sed -f my_script.sed logfile.txt
期待される実行結果:
This is an warning line.
This is a fail line.
awk
コマンド詳解:データ処理の万能ツール
awk
は、テキストファイルをレコード(通常は行)とフィールド(通常は空白で区切られた単語)に分割し、パターンマッチングとアクションに基づいて処理を行うプログラミング言語です。データ抽出、整形、集計に非常に強力です。
フィールド処理とパターンアクション
awk
の基本は パターン { アクション }
です。パターンにマッチした行に対してアクションを実行します。
実行手順と期待される結果
1. 各行の2番目のフィールドを出力
echo -e "apple 100\nbanana 200" | awk '{print $2}'
期待される実行結果:
100
200
2. 1番目のフィールドが ‘apple’ の行全体を出力
echo -e "apple 100\nbanana 200" | awk '$1 == "apple" {print}'
期待される実行結果:
apple 100
$0
は行全体、$1
, $2
, … は各フィールドを表します。
変数、条件分岐、ループ
awk
は変数、条件分岐 (if-else
)、ループ (for
, while
) をサポートしており、より複雑なロジックを記述できます。
実行手順と期待される結果
1. 合計を計算
echo -e "10\n20\n30" | awk '{sum += $1} END {print "Total: " sum}'
期待される実行結果:
Total: 60
2. 条件分岐の例
echo -e "apple 100\nbanana 200\norange 50" | awk '{ if ($2 > 100) print $1 " is expensive"; else print $1 " is cheap" }'
期待される実行結果:
apple is cheap
banana is expensive
orange is cheap
レポート生成と集計処理
awk
は、BEGIN
ブロック(入力処理前)、END
ブロック(入力処理後)を活用することで、レポート生成や集計処理に威力を発揮します。
サンプルデータの準備
まず、以下の内容で scores.csv
ファイルを作成します。
cat << 'EOF' > scores.csv
Name,Score
Alice,85
Bob,92
Charlie,78
EOF
実行手順と期待される結果
awk -F',' 'BEGIN {sum=0; count=0} NR > 1 {sum+=$2; count++} END {if (count > 0) print "Average Score: " sum/count}' scores.csv
期待される実行結果:
Average Score: 85
awk
とsed
を組み合わせた実践例
awk
とsed
は、それぞれの得意分野を活かしてパイプラインで連携することで、単独では難しい高度なテキスト処理を実現します。
複雑なログデータの解析と整形
Webサーバーのアクセスログから、特定のエラーコードを含む行を抽出し、さらにその行から必要な情報(IPアドレス、リクエストパス、エラーメッセージ)だけを整形して表示するシナリオを考えます。
サンプルデータの準備
まず、以下の内容で access.log
ファイルを作成します。
cat << 'EOF' > access.log
192.168.1.1 - - [18/Oct/2025:10:00:00 +0900] "GET /api/data HTTP/1.1" 500 1234 "http://example.com/" "Mozilla/5.0"
192.168.1.2 - - [18/Oct/2025:10:00:05 +0900] "GET /index.html HTTP/1.1" 200 5678 "-" "Mozilla/5.0"
192.168.1.3 - - [18/Oct/2025:10:00:10 +0900] "POST /admin/login HTTP/1.1" 401 987 "http://example.com/login" "Mozilla/5.0"
EOF
実行手順と期待される結果
cat access.log | \
sed -n '/ 500 /p' | \
awk '{print $1, $7}'
期待される実行結果:
192.168.1.1 /api/data
この例では、まずsed
で「500」を含む行をフィルタリングし、その結果をawk
に渡してIPアドレス(1番目のフィールド)とリクエストパス(7番目のフィールド)を抽出しています。
CSV/TSVデータの加工
CSVファイルから特定の列を抽出し、その値を基に新しい列を追加したり、特定の条件を満たす行だけをフィルタリングするような加工も可能です。
サンプルデータの準備
まず、以下の内容で products.csv
ファイルを作成します。
cat << 'EOF' > products.csv
ID,Name,Price,Stock
1,Apple,100,50
2,Banana,200,10
3,Orange,150,0
EOF
実行手順と期待される結果
1. 在庫が0の商品を抽出し、「SOLD OUT」のステータスを追加
awk -F',' 'BEGIN {OFS=","} NR==1 {print $0, "Status"} NR>1 {if ($4 == 0) print $0, "SOLD OUT"; else print $0, "IN STOCK"}' products.csv
期待される実行結果:
ID,Name,Price,Stock,Status
1,Apple,100,50,IN STOCK
2,Banana,200,10,IN STOCK
3,Orange,150,0,SOLD OUT
この例では、awk
を使ってCSVファイルを処理しています。
-F','
: フィールド区切り文字をカンマに設定します。BEGIN {OFS=","}
: 出力フィールド区切り文字をカンマに設定します。NR==1 {print $0, "Status"}
: 1行目(ヘッダー行)の場合、行全体と “Status” という新しいヘッダーを出力します。NR>1 {if ($4 == 0) print $0, "SOLD OUT"; else print $0, "IN STOCK"}
: 2行目以降の場合、4番目のフィールド(Stock)が0であれば “SOLD OUT”、そうでなければ “IN STOCK” を追加して出力します。
まとめと次のステップ
今回は、Linuxパイプラインにおけるテキスト処理の強力なツールであるawk
とsed
について深く掘り下げました。
sed
はストリームエディタとして、テキストの置換、削除、挿入といった編集作業に優れており、正規表現を組み合わせることで複雑なパターンマッチングと操作が可能です。
一方、awk
はパターン走査・処理言語として、データをフィールドに分割し、条件に基づいた抽出、整形、集計を行うのに非常に強力です。
これら二つのツールをパイプラインで連携させることで、単独では難しい高度なデータ加工タスクを柔軟かつ効率的にこなすことができます。
複雑なログ解析からCSVデータの整形、レポート生成まで、awk
とsed
はあなたのデータ処理スキルを次のレベルへと引き上げるでしょう。
次回の記事では、Linuxパイプラインにおけるエラーハンドリングとデバッグのベストプラクティスを探ります。お楽しみに!
免責事項
本記事の内容は、情報提供のみを目的としています。記載されているコマンドや手順を実行する際は、ご自身の責任において行ってください。実行環境やバージョンによって結果が異なる場合があります。本記事の内容によって生じたいかなる損害についても、著者は一切の責任を負いません。