sed|シェル
はじめに
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.araisun.com, request: "GET /.well-known/openid-configuration HTTP/1.1", host: "k.araisun.com"
ホスト名とエラーでフィルタリングして、ファイル名だけを抽出する
grep "host: \"k.araisun.com\"" /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
grep
コマンドの-v
オプションを使うと、特定のパターンを含む行を除外できます。結果を出力する前に、uniq -c
によって重複行をまとめ、カウントさせています。そしてsort
コマンドで、重複の数が少ない順に並べ替えて出力します。
関連記事
- ls・tree・sort・uniq コマンドの使い方
- iconvコマンドでエンコーディング変換 macOS/Linux/Unix
- macOSで学ぶfind・grepの基本テクニック・実用例
- 【tesseractでOCR】PDFから文字の抽出→文字データが埋め込まれたPDFを作成【自炊への道】
- rename 名前の一括変更|シェル