Ubuntuのsedとawkでテキスト処理する方法【実例つき】

コマンド



Ubuntuでテキスト処理をするとき、sedawkは知っておくと格段に作業が速くなるコマンドです。ログファイルの整形・特定行の抽出・CSVの集計など、Linuxを使いこなすうえで欠かせないツールです。

本記事では実際にUbuntu 24.04 LTS(Docker公式イメージ)でコマンドを実行した結果をもとに、sedawkの使い方を具体的に解説します。

この記事のポイント

  • Ubuntu 24.04 には GNU sed 4.9 と mawk 1.3.4 が標準搭載されている(実測済み)
  • sed は「行単位のテキスト置換・削除・抽出」に強い
  • awk は「フィールド分割・条件フィルタ・数値集計」に強い
  • 2つをパイプでつなぐとログ解析・設定ファイル処理が1行で完結する
  • コマンドは Ubuntu 22.04 でも動作確認済み

目次

  1. 前提環境と確認方法
  2. sedの基本的な使い方
  3. sedの応用例(正規表現・複数置換)
  4. awkの基本的な使い方
  5. awkの応用例(集計・CSVパース)
  6. sed + awk の組み合わせ実例
  7. よくあるエラーと解決策
  8. まとめ

前提環境と確認方法

本記事のコマンドはすべて以下の環境で実行・確認しています。

項目
OS Ubuntu 24.04 LTS(noble)
sed バージョン GNU sed 4.9
awk バージョン mawk 1.3.4 20240123
実行環境 Docker公式イメージ ubuntu:24.04
確認日 2026-06-13

まず自分の環境でバージョンを確認してみましょう。




ubuntu@server: ~
$ sed –version | head -1
sed (GNU sed) 4.9
$ awk –version | head -1
mawk 1.3.4 20240123
sed/awk バージョン確認(Ubuntu 24.04 実測)
sed/awk バージョン確認(Ubuntu 24.04 実測)

Ubuntu 24.04 では sed(GNU sed 4.9)と awk(mawk 1.3.4)が標準でインストールされています。どちらも追加インストールなしで使えます。

Ubuntu 22.04 との違い

Ubuntu 22.04 では sed 4.8 が搭載されていました(実測済み)。24.04 では 4.9 にアップデートされています。awk は 22.04 でも mawk が使えますが、24.04 からはデフォルトで含まれています。どちらのバージョンでも本記事のコマンドはそのまま動作します。

sedの基本的な使い方

sed(stream editor)はテキストストリームを1行ずつ処理するコマンドです。ファイルを直接編集するのではなく、標準入力を受け取って加工した結果を標準出力に流す設計になっています。

手順1:基本構文を理解する

sed の基本構文はシンプルです。




ubuntu@server: ~
$ echo ‘Hello, World!’ | sed ‘s/World/Linux/’
Hello, Linux!

s/置換前/置換後/ が sed の最も基本的な使い方です。s は substitute(置換)の略です。

手順2:行削除(/パターン/d)

特定のパターンに一致する行を丸ごと削除できます。




ubuntu@server: ~
$ printf ‘apple\nbanana\ngrape\nblueberry\n’ | sed ‘/banana/d’
apple
grape
blueberry

banana が含まれる行だけが削除され、残り3行が出力されました。設定ファイルのコメント行(`#`で始まる行)を除去するときによく使います。

手順3:特定行の抽出(sed -n ‘開始,終了p’)




ubuntu@server: ~
$ printf ‘line1\nline2\nline3\nline4\n’ | sed -n ‘2,3p’
line2
line3

-n は自動出力を抑制するオプション、'2,3p' は2〜3行目を表示(print)する指示です。組み合わせることで「指定した行範囲だけを表示」できます。

sedの応用例(正規表現・複数置換)

手順4:複数ルールの同時適用(-e オプション)

複数の置換ルールを1コマンドで適用するには -e を使います。




ubuntu@server: ~
$ echo ‘foo bar baz’ | sed -e ‘s/foo/FOO/’ -e ‘s/bar/BAR/’
FOO BAR baz

手順5:正規表現でIPアドレスをマスク

ログに含まれるIPアドレスを正規表現でまとめてマスクする例です。




ubuntu@server: ~
$ echo ‘Server IP: 192.168.1.100 (private)’ | sed ‘s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/x.x.x.x/g’
Server IP: x.x.x.x (private)

g フラグを末尾につけると、行内の該当パターンをすべて置換します(デフォルトは最初の1件のみ)。

手順6:コメント行・空行を一度に除去




ubuntu@server: ~
$ printf ‘# コメント\nhost = localhost\n\nport = 8080\n# 別コメント\nuser = admin\n’ | sed ‘/^#/d; /^$/d’
host = localhost
port = 8080
user = admin

; でルールをつなげて複数の削除条件を1コマンドにまとめられます。設定ファイルの前処理でよく使うパターンです。

sed 基本コマンド実行結果(Ubuntu 24.04 実測)
sed 基本コマンド実行結果(Ubuntu 24.04 実測)

awkの基本的な使い方

awkフィールド(列)単位でテキストを処理するのが得意なコマンドです。スペースやタブで区切られたデータを扱うとき、sed より直感的に書けます。

手順7:特定フィールドの抽出(, …)

$1 が1列目、$2 が2列目…と番号でフィールドを参照します。




ubuntu@server: ~
$ printf ‘Alice 30 Engineer\nBob 25 Designer\nCharlie 35 Manager\n’ | awk ‘{print $1, $3}’
Alice Engineer
Bob Designer
Charlie Manager

手順8:条件フィルタ($フィールド 演算子 値)

フィールドの値で行を絞り込めます。




ubuntu@server: ~
$ printf ‘Alice 30 Engineer\nBob 25 Designer\nCharlie 35 Manager\n’ | awk ‘$2 >= 30 {print $1, “age=”$2}’
Alice age=30
Charlie age=35

2列目(年齢)が30以上の行だけ表示されました。grep とは違い数値条件でフィルタリングできるのが awk の強みです。

手順9:数値集計(sum, avg, NR)




ubuntu@server: ~
$ printf ’10\n20\n30\n40\n50\n’ | awk ‘{sum += $1} END {print “sum=” sum, “avg=” sum/NR}’
sum=150 avg=30

NR(Number of Records)は処理した行数が自動で入る変数です。END{} ブロックは全行の処理が終わった後に1回だけ実行されます。

awkの応用例(集計・CSVパース)

手順10:フィールドセパレータ指定(-F)でCSVを処理

デフォルトのフィールドセパレータはスペース/タブですが、-F で変更できます。




ubuntu@server: ~
$ printf ‘name,score,grade\nAlice,95,A\nBob,72,B\nCharlie,88,A\n’ | awk -F’,’ ‘NR>1 {print $1″: “$3}’
Alice: A
Bob: B
Charlie: A

NR>1 でヘッダー行(1行目)をスキップし、名前と成績だけを出力しました。

手順11:BEGIN/END ブロックでヘッダー付き出力




ubuntu@server: ~
$ printf ‘apple\nbanana\ngrape\n’ | awk ‘BEGIN{print “=== fruits ===”} {print NR”: “$0} END{print “total=” NR}’
=== fruits ===
1: apple
2: banana
3: grape
total=3

BEGIN{} は最初の行を読む前に実行、END{} は全行処理後に実行されます。レポートのヘッダー・フッター出力に便利です。

awk 基本コマンド実行結果(Ubuntu 24.04 実測)
awk 基本コマンド実行結果(Ubuntu 24.04 実測)

sed + awk の組み合わせ実例

sed と awk をパイプでつなぐことで、実務で役立つテキスト処理が1行で完結します。

実例①:アプリログのエラー件数を集計する

以下のようなアプリログを用意して、エラー件数をカウントしてみます。




ubuntu@server: ~
$ printf ‘2024-01-10 ERROR Failed to connect\n2024-01-10 INFO Server started\n2024-01-11 ERROR Timeout\n2024-01-11 INFO Job done\n2024-01-11 WARN Low memory\n’ > /tmp/sample.log
$ awk ‘{print $2}’ /tmp/sample.log | sort | uniq -c | sort -rn
2 INFO
2 ERROR
1 WARN

awk で2列目(ログレベル)だけ取り出し、sort | uniq -c でレベル別に件数を集計しています。ERROR が2件、INFO が2件、WARN が1件という結果が実測で得られました。

実例②:sedでタイムスタンプを除去してawkで集計




ubuntu@server: ~
$ sed ‘s/^[0-9-]* //’ /tmp/sample.log | awk ‘{count[$1]++} END{for(k in count) print k, count[k]}’
INFO 2
WARN 1
ERROR 2

sed でタイムスタンプ部分(行頭の日付)を除去してから、awk でレベルごとに件数を集計しました。「sed でフォーマット整形 → awk で集計」はログ解析の定番パターンです。

実例③:/etc/passwd から一般ユーザーを抽出




ubuntu@server: ~
$ awk -F: ‘$3 >= 1000 && $3 < 65534 {print $1, "uid="$3, "shell="$7}' /etc/passwd
ubuntu uid=1000 shell=/bin/bash

/etc/passwd はコロン区切りのファイルです。-F: でセパレータを指定し、UID が1000以上(一般ユーザー)の行だけを抽出しています。Ubuntu 24.04 のコンテナでは ubuntu ユーザーだけが表示されました。

sed+awk パイプライン組み合わせ実例(Ubuntu 24.04 実測)
sed+awk パイプライン組み合わせ実例(Ubuntu 24.04 実測)
sed/awk バージョン横断比較(Ubuntu 22.04 vs 24.04 実測)
sed/awk バージョン横断比較(Ubuntu 22.04 vs 24.04 実測)

よくあるエラーと解決策

エラー①:sed: -e expression #1, char X: unterminated `s’ command




ubuntu@server: ~
$ echo ‘foo/bar’ | sed ‘s/foo/bar/baz’
sed: -e expression #1, char 11: unknown option to `s’

原因: s/置換前/置換後/ の区切り文字が合っていないか、フラグが不正です。末尾フラグは g(全置換)・I(大小文字無視)などに限られます。

スラッシュを含む文字列を置換したいとき

置換前後にスラッシュが含まれる場合は区切り文字を変更できます。
例:sed 's|/usr/local|/opt|g' のようにパイプや ! なども使えます。

エラー②:awk: line 1: syntax error at or near end of string

原因: awk のプログラム内で引用符が対応していないか、{} の対応がずれています。




ubuntu@server: ~
$ echo ‘test’ | awk ‘{print $1’
awk: line 1: syntax error at or near end of string
$ echo ‘test’ | awk ‘{print $1}’
test

エラー③:awk で gawk の機能が使えない

Ubuntu 24.04 のデフォルト awkmawk です。gawk 専用の機能(gensub など)を使いたい場合は gawk を別途インストールします。




ubuntu@server: ~
$ sudo apt install -y gawk
Reading package lists… Done
Building dependency tree… Done
Setting up gawk (1:5.2.1-2build3) …
$ gawk –version | head -1
GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.2.1, GNU MP 6.3.0)

まとめ

sed と awk の使い方をまとめると次のとおりです。

sed / awk まとめ

  • Ubuntu 24.04 には GNU sed 4.9 と mawk 1.3.4 が標準搭載(追加インストール不要)
  • sed は「置換(s/a/b/)・削除(/p/d)・行抽出(-n ‘2,3p’)」が基本
  • awk は「フィールド参照($1〜)・条件フィルタ・数値集計(END{})」が得意
  • sed でフォーマット整形 → awk で集計、のパイプパターンがログ解析で有効
  • gawk 専用機能が必要な場合は sudo apt install gawk で追加可能

sed と awk を覚えておくと、VPSやサーバー上でのログ解析・設定ファイルの一括修正がシェルスクリプト一本で完結します。コマンドに慣れてきたら、自分のVPSでリアルなログを処理してみましょう。

VPSを選ぶなら、Vultr(月額$5〜)が東京リージョンもあり初心者にも使いやすいです。詳しくは下記の比較記事もご覧ください。

コメント

タイトルとURLをコピーしました