sed -n コマンド情報まとめ
ターミナルの sed -n コマンドについて、オプション情報、正規表現との組み合わせ、grep や awk との違い、AIエージェントが実行した場合の注意点を紹介しています。
sed -n とは
sed -n(stream editor, silent mode)は、テキストストリームを行単位で処理する sed コマンドに -n オプションを付けた形です。通常の sed は処理した行を自動的に標準出力へ出力しますが、-n を指定することで自動出力を抑制し、p コマンドなどで明示的に指定した行だけを出力できます。ログファイルから特定行を抽出したり、スクリプトで必要な行だけを選んで処理したりする場面で広く使われています。
主なオプション・コマンドの意味
| オプション/コマンド | 意味 |
|---|---|
-n | 自動出力を抑制する(silent モード)。p で明示的に出力した行だけが表示される |
p | 現在の行をパターンスペースから標準出力へ出力する |
/正規表現/p | 正規表現にマッチした行を出力する |
行番号p | 指定した行番号の行を出力する |
行番号,行番号p | 指定した行番号の範囲を出力する |
-e | 複数のスクリプトを一度に指定する |
-E(または -r) | 拡張正規表現(ERE)を有効にする |
-n オプション単体では何も出力されません。必ず p(print)コマンドと組み合わせて使います。sed -n '条件p' ファイル名 という形が基本構文です。
よく使う組み合わせ
特定の行番号を出力する
# 5行目だけを出力
sed -n '5p' access.log
# 10〜20行目を出力
sed -n '10,20p' access.log
行番号を直接指定してその行のみを取り出します。ログファイルの特定範囲を確認したいときに便利です。head や tail では難しい「中間の行だけ」を抽出できます。
正規表現にマッチした行を出力する
# "ERROR" を含む行を出力
sed -n '/ERROR/p' app.log
# "2024-06" で始まる行を出力(拡張正規表現)
sed -n -E '/^2024-06/p' app.log
正規表現と p の組み合わせは、grep に近い動作をします。-E オプションを加えると +、?、() などの拡張正規表現が使えます。
パターンにマッチした行からN行を出力する
# "START" を含む行から3行を出力
sed -n '/START/,+2p' app.log
# "BEGIN" から "END" までの範囲を出力
sed -n '/BEGIN/,/END/p' config.txt
範囲指定では「開始パターン〜終了パターン」や「開始パターン〜N行後」という形で、ブロック単位のテキストを抽出できます。設定ファイルの特定セクションだけを取り出す際に重宝します。
複数条件を組み合わせて出力する
# "ERROR" または "WARN" を含む行を出力
sed -n -e '/ERROR/p' -e '/WARN/p' app.log
# パイプで grep と組み合わせる
sed -n '100,200p' access.log | grep "404"
-e を複数指定することで OR 条件のような抽出ができます。また sed -n で行範囲を絞り込んでから grep に渡すパイプ構成は、大きなログファイルの処理を効率化します。
sed -n と grep vs awk の違い
どれもテキストのフィルタリングに使えますが、用途と得意な場面が異なります。
| 項目 | sed -n | grep | awk |
|---|---|---|---|
| 主な用途 | 行の範囲指定・パターン抽出・変換 | パターンマッチした行の抽出 | フィールド単位の処理・集計 |
| 行番号での範囲指定 | ○('10,20p') | △(-n フラグで行番号表示のみ) | ○(NR>=10 && NR<=20) |
| 正規表現 | ○(BRE/ERE) | ○(BRE/ERE/PCRE) | ○(ERE) |
| フィールド分割 | × | × | ○($1, $2…) |
| テキスト置換 | ○(s///) | × | ○(gsub) |
| 学習コスト | 中 | 低 | 高 |
「特定行番号の範囲を抽出する」なら sed -n が最もシンプルです。「パターンにマッチした行を出力するだけ」なら grep の方が直感的に書けます。フィールド単位で値を取り出したり集計したりするなら awk が適しています。3つを組み合わせてパイプで繋ぐのも一般的な手法です。
ユースケース
Apacheアクセスログから特定時間帯のエラーを抽出する
# 500番台エラーかつ "14:" の時間帯(午後2時台)のログを抽出
sed -n '/14:/p' /var/log/apache2/access.log | grep '" 5[0-9][0-9] '
大量のアクセスログから特定時間帯のエラーだけを絞り込む場合、sed -n で時間帯の行を先に絞り、grep でステータスコードを絞るパイプ構成が効果的です。
設定ファイルの特定セクションだけを確認する
# [database] セクションから次のセクション([で始まる行)直前までを抽出
sed -n '/^\[database\]/,/^\[/p' config.ini | sed '$d'
INI形式や設定ファイルのセクション単位で内容を確認するときに使います。末尾の sed '$d' で次セクションのヘッダー行を除去しています。
CSVの特定行範囲をヘッダーごと抽出する
# ヘッダー(1行目)と100〜200行目を合わせて出力
{ sed -n '1p' data.csv; sed -n '100,200p' data.csv; } > output.csv
CSVのヘッダー行を保ちながら中間の行だけを切り出したいときに役立ちます。head -1 とも組み合わせられますが、sed -n に統一するとスクリプトの可読性が上がります。
AIエージェントが実行しようとした場合
AIエージェントの目的
AIエージェントは主に次のような目的で sed -n を実行しようとすることがあります。
- エラーログや設定ファイルから必要な行を抽出して内容を確認するために実行することがあります
- 処理対象ファイルの特定範囲を確認し、次の操作(置換・削除)の前に内容を検証するために実行することがあります
- スクリプト内で条件に合う行数を把握するためのプレビュー処理として実行することがあります
危険性
sed -n コマンドは、ファイルの読み取りと標準出力への表示のみを行い、ファイルの内容を変更しません。危険性はなく、AIエージェントが実行しても問題ありません。
ただし、-n を省略して -i(インプレース編集)と組み合わせた sed -i に変化した場合はファイルが書き換えられるため、エージェントが生成するコマンドを確認する際は -i の有無に注意してください。