sedコマンドで置換処理 macOS/Linux/Unixシェルコマンド
macOSでのsedコマンドの基本的な使い方を説明します。sedはストリームエディタで、テキストファイルやパイプからの入力に対して行単位の編集を行うことができます。テキストの加工や置換処理など、データの前処理に非常に便利なツールです。
【sedまとめ】 sedの基本的な使い方
コマンド | 説明 |
---|---|
sed 's/検索パターン/置換文字列/' ファイル名 | ファイル内で最初にマッチした検索パターンを置換文字列に置換します。 |
sed -i '' 's/検索パターン/置換文字列/' ファイル名 | ファイル内で最初にマッチした検索パターンを置換文字列に置換し、ファイルを直接更新します(インプレース編集)。 |
sed 's/検索パターン/置換文字列/g' ファイル名 | ファイル内の全てのマッチする検索パターンを置換文字列に置換します。 |
sed -n 'p' ファイル名 | ファイルの内容を出力します(-nオプションは自動での出力を抑制し、pコマンドで明示的に出力を指示)。 |
sed '/検索パターン/d' ファイル名 | 検索パターンにマッチする行を削除します。 |
sed -E 's/正規表現/置換文字列/g' ファイル名 | 拡張正規表現を使用して、ファイル内の全てのマッチするパターンを置換文字列に置換します。 |
sed '1,5d' ファイル名 | ファイルから1行目から5行目までを削除します。 |
sed 's/検索パターン/置換文字列/2' ファイル名 | ファイル内で2番目にマッチした検索パターンのみを置換文字列に置換します。 |
【sed初級編】sedを使ってみよう
サンプルテキストファイルを用意しました。このファイルを使用して、sedコマンドの使用例をいくつか実行してみましょう。ファイルの内容は以下の通りです:
こんにちは、世界!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、世界!
文字列の置換
sedコマンドを使って、「世界」を「プログラマー」に置換してみます。コマンド:
sed 's/世界/プログラマー/g' sample_text.txt
出力結果:
こんにちは、プログラマー!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、プログラマー!
行の削除
次に、「良い天気」を含む行を削除してみます。
コマンド:
sed '/良い天気/d' sample_text.txt
出力結果:
こんにちは、世界!
sedコマンドは強力です。
さようなら、世界!
ファイルの直接編集(インプレース編集)
ファイルを直接編集し、再度「世界」を「プログラマー」に置換しますが、今回はファイルを直接更新します。
コマンド:
sed -i '' 's/世界/プログラマー/g' sample_text.txt
ファイルの内容が以下の通り変更されました:
こんにちは、プログラマー!
今日は良い天気ですね。
sedコマンドは強力です。
さようなら、プログラマー!
【sed実践編】パイプで他のコマンドと組み合わせた
sedコマンドはテキスト処理の際に非常に強力で、他のコマンドと組み合わせてパイプ(|)で使用されることが多いです。ここでは、sedを他のコマンドと組み合わせた典型的な使用例をいくつか紹介します。ファイルから特定の行を抽出し、その行を編集
grepコマンドで特定のパターンにマッチする行を抽出し、sedでその行を編集する場合があります。grep '特定のパターン' ファイル名 | sed 's/検索パターン/置換文字列/g'
このコマンドは、ファイルから「特定のパターン」にマッチする行を見つけ出し、それらの行に含まれる「検索パターン」を「置換文字列」に置換します。
ログファイルから不要な情報を削除
ログファイルから特定のキーワードを含む行を除外したい場合に役立ちます。
cat ログファイル | sed '/不要なキーワード/d'
このコマンドは、ログファイルから「不要なキーワード」を含む行を削除して表示します。
ファイルの特定のセクションだけを表示
sedを使ってファイルの特定の範囲の行だけを抽出することもできます。sed -n '10,20p' ファイル名
ただし、この操作をパイプで他のコマンドと組み合わせる場合は、抽出した行に対してさらに処理を加えたい場合に便利です。
複数の編集操作を組み合わせる
sedで複数の編集操作を一度に行うことができます。echo "サンプルテキスト" | sed -e 's/サンプル/テスト/' -e 's/テキスト/データ/'
このコマンドは、「サンプル」を「テスト」に、そして「テキスト」を「データ」に置換します。
パイプライン内でのデータ加工
複雑なデータ加工の一環として、sedを使って一時的な修正を加えた後、さらにawkやsortなどのコマンドで処理を行うことがあります。
cat データファイル | sed 's/不要な部分//' | sort | uniq
この例では、まずsedを使って「不要な部分」を削除し、その後sortで並び替え、uniqで重複行を削除しています。
具体的に実行してみましょう。サンプルデータファイルを作成しました。このファイルは人名のリストを含み、各行には「名前:」という不要な部分が含まれています。ファイルの内容は以下の通りです:
名前:山田太郎
名前:鈴木一郎
名前:高橋花子
名前:山田太郎
名前:佐藤あきら
名前:鈴木一郎
このデータを使って、「cat データファイル | sed 's/不要な部分//' | sort | uniq」のコマンド例を実際に試してみます。目的は「名前:」を取り除き、名前をアルファベット順に並び替え、重複を削除することです。
実際のコマンドは以下のようになります:
cat sample_data.txt | sed 's/名前://g' | sort | uniq
このコマンドを実行すると、以下のような結果が得られます:
山田太郎
鈴木一郎
高橋花子
佐藤あきら
この結果から、各行から「名前:」が取り除かれ、名前がアルファベット順に並び替えられ、重複が削除されました。
日本語データのソート
まず、この日本語データを使って単純なソートを実行する場合、sortコマンドは以下のように使用します:
sort fruit_data.txt
このコマンドは、データを辞書順にソートします。
フィールドを指定したソート
各行をカンマで区切られたフィールドとして扱い、特定のフィールド(この場合は数量)に基づいてソートを行います。sortコマンドでは-tオプションでフィールドの区切り文字を指定し、-kオプションでソートの基準となるフィールド番号を指定します。
数量に基づいてソートする場合のコマンドは以下の通りです:
sort -t, -k2,2n fruit_data.txt
- -t,はフィールドの区切り文字がカンマであることを指定します。
- -k2,2nは2番目のフィールド(数量)に基づいて数値順にソートすることを指定します。
【sed現場編】nginxのログファイル解析
次の形でnginxのエラーログかあったとします。
2024/03/13 23:44:54 [error] 3062295#3062295: *10304 open() "/dir/path/.well-known/openid-configuration" failed (2: No such file or directory), client: 165.232.170.165, server: k.inoto.jp, request: "GET /.well-known/openid-configuration HTTP/1.1", host: "k.inoto.jp"
ホスト名とエラーでフィルタリングして、ファイル名だけを抽出する
grep "host: \"k.inoto.jp\"" /var/log/nginx/error.log.1 | grep "failed" | sed -E 's/.* open\(\) "([^"]+)".*/\1/g'
特定のディレクトリ名を除外して、ファイル名だけを抽出する
grep -v ".well-known" /var/log/nginx/error.log.1 | sed -E 's/.* open\(\) "([^"]+)".*/\1/g' | uniq -c | sort