Linuxシステム管理タスクのための15のsedコマンドのヒント
すべてのシステム管理者は、日々プレーンテキストファイルを扱わなければなりません。特定のセクションを表示する方法、単語を置き換える方法、そしてそれらのファイルからコンテンツをフィルタリングする方法を知っておくことは、Google検索をせずに持っておくべきスキルです。
この記事では、よく知られたストリームエディタsedについてレビューし、前述の目標を達成するための15のヒントを共有します。
sedコマンドとは何ですか?
'sed'コマンドは、ストリームエディタの略で、テキストストリーム上で動作する多用途で強力なテキスト操作ツールです。ユーザーはデータに対して検索、置換、挿入、削除などのさまざまな操作を行うことができます。'sed'はテキスト操作のためのパターンを定義するために正規表現を使用し、バッチ編集タスクやスクリプトでのテキスト処理に利用することができます。
その特筆すべき特徴の一つは、インプレース編集であり、ファイルを直接変更したり、バックアップコピーを作成しながら変更を行うことができます。‘Sed’は、システム管理者、プログラマー、そしてコマンドラインでのテキスト変換やデータ操作タスクに関わるすべての人にとって重要なツールです。
以下は一般的な「sed」コマンドの例です:
1. ファイルの行の範囲を表示する
headやtailなどのツールを使用すると、ファイルの最上部や最下部を表示できます。では、中間の部分を表示する必要がある場合はどうでしょうか?以下のsedワンライナーを使用すると、tecmint.txtから5行目から10行目を取得できます:
sed -n '5,10p' tecmint.txt
2. 特定の範囲を除いた全ファイルの表示
一方で、特定の範囲を除外してファイル全体を印刷したい可能性もあります。tecmint.txtから20行目から35行目を除外するには、次のようにします:
sed '20,35d' myfile.txt
3. 非連続行および範囲の表示
あなたが連続していない行のセットや、複数の範囲に興味を持っている可能性があります。tecmint.txtから5-7行と10-13行を表示しましょう:
sed -n -e '5,7p' -e '10,13p' tecmint.txt
ご覧のように、-eオプションは、各範囲に対して特定のアクション(この場合は行を出力すること)を実行することを可能にします。
4. ファイル内の単語や文字列を置き換える
tecmint.txt内のすべての「version」という単語を「story」に置き換えるには、次のようにします:
sed 's/version/story/g' tecmint.txt
さらに、文字の大文字と小文字を無視するために、gの代わりにgiを使用することを検討するかもしれません。
sed 's/version/story/gi' myfile.txt
複数の空白を1つのスペースに置き換えるために、ip route showコマンドの出力をパイプで使用します:
ip route show | sed 's/ */ /g'
ip route show の出力をパイプラインありとなしで比較してください:
5. 範囲内の単語や文字列の置き換え
特定の行範囲内(例えば30から40まで)のみで単語を置き換えたい場合は、次のようにできます:
sed '30,40 s/version/story/g' tecmint.txt
もちろん、範囲の代わりに対応する番号で単一の行を示すことができます。
6. ファイルからコメントを削除する
時々、設定ファイルにはコメントが含まれています。これは確かに便利ですが、すべてを一目で確認したい場合は、設定ディレクティブのみを表示する方が役立つことがあります。
Apacheの設定ファイルから空行または#で始まる行を削除するには、次のようにします:
sed '/^#\|^$\| *#/d' httpd.conf
キャレットサインの後に数値記号(^#)が続くと、行の始まりを示しますが、^$は空白行を表します。垂直バーはブール演算を示し、バックスラッシュは垂直バーをエスケープするために使用されます。
この特定のケースでは、Apacheの設定ファイルにいくつかの行の先頭でない#’sがあり、そのために*#が使われてそれらも削除されます。
7. ファイル内のケースに依存しない単語を置換する
大文字または小文字で始まる単語を別の単語に置き換えるために、sed を使用することもできます。例として、tecmint.txt の中の単語 zip または Zip を rar に置き換えてみましょう:
sed 's/[Zz]ip/rar/g' tecmint.txt
8. ログファイル内の特定のイベントの検索
sedの別の使用法は、特定の正規表現に一致するファイルの行を印刷することです。たとえば、CentOSサーバーの/var/log/secureログに基づいて、7月2日に行われた認可および認証の活動を表示することに関心があるかもしれません。
この場合、検索するパターンは各行の先頭にある7月2日です:
sed -n '/^Jul 1/ p' /var/log/secure
9. ファイルにスペースまたは空白行を挿入すること
sedを使用すると、ファイル内の空でない各行のためにスペース(空白行)を挿入することもできます。LICENSEというプレーンテキストファイルの毎行ごとに1つの空白行を挿入するには、次のようにします:
sed G tecmint.txt
2行の空白行を挿入するには、次のようにします:
sed 'G;G' tecmint.txt
追加の空白行を追加したい場合は、大文字のGをセミコロンで区切って追加してください。以下の画像はこのヒントで説明されている例を示しています:
このヒントは、大きな設定ファイルを検査したい場合に役立つかもしれません。行ごとに空白を挿入し、その出力をlessにパイプすると、より読みやすい体験が得られます。
10. ファイル内の ^M を削除する
dos2unixプログラムは、Windows/MacフォーマットのプレーンテキストファイルをUnix/Linux形式に変換し、これらのプラットフォームで使用されるテキストエディタによって挿入された隠れた改行文字を削除します。あなたのLinuxシステムにインストールされていない場合は、インストールする代わりにsedを使ってその機能を模倣することができます。
左側の画像では、いくつかのDOS改行文字(^M)を見ることができ、それらは後で次のように削除されました:
sed -i 's/\r//' myfile.txt
注意してください。-iオプションはインプレース編集を示します。この場合、変更は画面に表示されず、ファイルに保存されます。
注意: Vimエディタでファイルを編集する際に、Ctrl+VとCtrl+Mを使用してDOS改行文字を挿入できます。
11. Sedコマンドを使ってバックアップファイルを作成する
前回のヒントでは、sed を使用してファイルを変更しましたが、元のファイルを保存しませんでした。場合によっては、万が一に備えて元のファイルのバックアップコピーを保存するのが良いアイデアです。
そのためには、元のファイルを名前変更するために使用される接尾辞を -i オプションに続けて(シングルクォート内に)示してください。
次の例では、すべてのthisまたはThis(大文字小文字を無視して)のインスタンスをmyfile.txt内でthatに置き換えます。また、元のファイルはmyfile.txt.origとして保存します。
最後に、diffユーティリティを使用して両方のファイルの違いを特定します:
sed -i'.orig' 's/this/that/gi' myfile.txt
12. ファイル内の単語のペアを入れ替える
ファイルに「名、姓」の形式でフルネームが含まれていると仮定しましょう。そのファイルを適切に処理するために、「姓」と「名」を入れ替えたいかもしれません。
私たちはそれをsedを使って非常に簡単にできます:
sed 's/^\(.*\),\(.*\)$/\2\, /g' names.txt
上の画像では、かっこが特殊文字であるため、エスケープする必要があり、数字の1と2も同様です。
これらの数字は、ハイライトされた正規表現を示しています(これらは括弧内に表示する必要があります):
- 1は各行の始まりをカンマまで示します。
- 2は、カンマの右側から行の終わりまでのすべてを表すプレースホルダーです。
希望する出力は、形式SecondColumn(姓)+ コンマ + スペース + FirstColumn(名前)で示されます。お好きなように変更してください。
13. 別の一致が見つかった場合にのみ単語を置き換える
時には、特定の単語のすべてのインスタンスを置き換えたり、ランダムにいくつかを置き換えたりすることが、私たちが必要としているものと正確に一致しないことがあります。おそらく、別の一致が見つかった場合に置き換えを行う必要があります。
例えば、同じ行に「services」という単語が見つかった場合のみ、startをstopに置き換えたいかもしれません。そのシナリオでは、以下のようになります:
We need to start partying at work,
but let’s remember to start all services first.
最初の行では、startはその行にサービスという言葉が現れないため、stopに置き換えられませんが、2行目は異なります。
# sed '/services/ s/start/stop/g' msg.txt
14. 一度に二つ以上の置換を行う
1つのsedコマンドで2つ以上の置換を組み合わせることができます。myfile.txtの「that」と「line」をそれぞれThisとverseに置き換えましょう。
これは、通常のsed置換コマンドを使用し、その後にセミコロンと2つ目の置換コマンドを続けることで行うことができることに注意してください:
# sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt
このヒントは次の画像に示されています。
15. Sedとその他のコマンドの組み合わせ
もちろん、sed は他のLinuxコマンドと組み合わせてより強力なコマンドを作成することができます。例えば、TIP #4で示された例を使って、ip routeコマンドの出力からIPアドレスを抽出してみましょう。
私たちはまず、srcという単語がある行だけを印刷します。次に、複数のスペースを1つのスペースに変換します。最後に、IPアドレスがある9番目のフィールド(単一のスペースをフィールドの区切りとして考える)を切り取ります:
# ip route show | sed -n '/src/p' | sed -e 's/ */ /g' | cut -d' ' -f9
以下の画像は、上記のコマンドの各ステップを示しています:
要約
このガイドでは、日々のシステム管理タスクを支援するための15のsedのヒントとコツを共有しました。他に定期的に使用しているヒントがあり、私たちやコミュニティの他のメンバーと共有したいことはありますか?
そうであれば、下のコメントフォームを使用してお気軽にお知らせください。質問やコメントも歓迎します - お問い合わせをお待ちしております!












