15日常のLinuxシステム管理タスクに役立つ「sed」コマンドのヒントとコツ


すべてのシステム管理者は、プレーンテキストファイルを日常的に処理する必要があります。特定のセクションを表示する方法、単語を置き換える方法、およびそれらのファイルからコンテンツをフィルタリングする方法を知ることは、Google検索を行わなくても手元にある必要があるスキルです。

この記事では、有名なストリームエディターであるsedを確認し、前述の目標を達成するためにsedを使用するための15のヒントなどを共有します。

1.ドキュメントの行の範囲を表示する

ヘッドやテールなどのツールを使用すると、ファイルの下部または上部を表示できます。中央のセクションを表示する必要がある場合はどうなりますか?次のsedone-linerは、myfile.txtから5行目から10行目を返します。

# sed -n '5,10p' myfile.txt

2.指定された範囲を除くファイル全体を表示する

一方、特定の範囲を除くファイル全体を印刷したい場合もあります。 myfile.txtから20行目から35行目を除外するには、次のようにします。

# sed '20,35d' myfile.txt

3.連続していない線と範囲の表示

連続していない一連の行、または複数の範囲に関心がある可能性があります。 myfile.txtの5〜7行目と10〜13行目を表示してみましょう。

# sed -n -e '5,7p' -e '10,13p' myfile.txt

ご覧のとおり、 -e オプションを使用すると、範囲ごとに特定のアクション(この場合は行の印刷)を実行できます。

4.単語または文字の置換(基本的な置換)

myfile.txtの version という単語のすべてのインスタンスを story に置き換えるには、次の手順を実行します。

# sed 's/version/story/g' myfile.txt

さらに、大文字と小文字を無視するために、 g の代わりに gi を使用することを検討することをお勧めします。

# sed 's/version/story/gi' myfile.txt

複数の空白スペースを単一のスペースに置き換えるには、 ip route show の出力とパイプラインを使用します。

# ip route show | sed 's/  */ /g'

パイプラインがある場合とない場合の ip route show の出力を比較します。

5.範囲内の単語または文字を置き換える

行範囲(たとえば、30〜40)内の単語のみを置き換えることに関心がある場合は、次のことができます。

# sed '30,40 s/version/story/g' myfile.txt

もちろん、範囲の代わりに、対応する番号を介して1行を示すことができます。

6.正規表現の使用(高度な置換)– I

構成ファイルにコメントがロードされる場合があります。これは確かに便利ですが、すべてを一目で確認したい場合は、構成ディレクティブのみを表示すると便利な場合があります。

空の行またはで始まる行をApache構成ファイルから削除するには、次のようにします。

# sed '/^#\|^$\| *#/d' httpd.conf

キャレット記号とそれに続く番号記号(^#)は行の始まりを示し、 ^ $ は空白行を示します。縦棒はブール演算を示しますが、円記号は縦棒をエスケープするために使用されます。

この特定のケースでは、Apache構成ファイルの行の先頭に# ’s がないため、 *#を使用してそれらも削除します。

7.正規表現の使用(高度な置換)– II

大文字または小文字で始まる単語を別の単語に置き換えるには、sedを使用することもできます。説明のために、myfile.txtでzipまたはZipという単語をrarに置き換えてみましょう。

# sed 's/[Zz]ip/rar/g' myfile.txt

8.特定のパターンを含む行を表示する

sedのもう1つの使用法は、特定の正規表現に一致するファイルから行を出力することです。たとえば、CentOS7サーバーの/ var/log/secureログに従って、7月2日に行われた承認および認証アクティビティを表示することに関心がある場合があります。

この場合、検索するパターンは、各行の先頭にある7月2日です。

# sed -n '/^Jul  1/ p' /var/log/secure

9.ファイルにスペースを挿入する

sedを使用すると、ファイル内の空でない行ごとにスペース(空白行)を挿入することもできます。プレーンテキストファイルであるLICENSEに1行おきに1行の空白行を挿入するには、次の手順を実行します。

# sed G myfile.txt

2つの空白行を挿入するには、次のようにします。

# sed 'G;G' myfile.txt

空白行を追加する場合は、セミコロンで区切って大文字のGを追加します。次の画像は、このヒントで概説されている例を示しています。

このヒントは、大きな構成ファイルを検査する場合に役立つことがあります。 1行おきに空白を挿入し、出力をより少ない値にパイピングすると、より読みやすい読み方になります。

10.インライン編集でdos2unixをエミュレートする

dos2unixプログラムは、プレーンテキストファイルをWindows/MacフォーマットからUnix/Linuxに変換し、これらのプラットフォームで使用されている一部のテキストエディターによって挿入された非表示の改行文字を削除します。 Linuxシステムにインストールされていない場合は、インストールする代わりにsedを使用してその機能を模倣できます。

左の画像では、いくつかのDOS改行文字(^ M)を見ることができますが、これらは後で次のように削除されました。

# sed -i 's/\r//' myfile.txt

-i オプションはインプレース編集を示していることに注意してください。その後、変更は画面に戻されませんが、ファイルに保存されます。

注: Ctrl + V および Ctrl + M を使用してvimエディターでファイルを編集しているときに、DOS改行文字を挿入できます。

11.元のファイルのインプレース編集とバックアップ

前のヒントでは、sedを使用してファイルを変更しましたが、元のファイルは保存しませんでした。万が一に備えて、元のファイルのバックアップコピーを保存しておくとよい場合があります。

これを行うには、元のファイルの名前を変更するために使用する -i オプション(一重引用符で囲みます)に続くサフィックスを指定します。

次の例では、thisまたはThis(大文字と小文字を区別しない)のすべてのインスタンスをmyfile.txtのインスタンスに置き換え、元のファイルをmyfile.txt.origとして保存します。

最後に、diffユーティリティを使用して、両方のファイルの違いを識別します。

# sed -i'.orig' 's/this/that/gi' myfile.txt

12.単語のペアを切り替える

名、姓の形式のフルネームを含むファイルがあるとします。ファイルを適切に処理するには、姓と名を切り替えることをお勧めします。

sedでそれをかなり簡単に行うことができます:

# sed 's/^\(.*\),\(.*\)$/\, /g' names.txt

上の画像では、特殊文字である括弧は、数字の1と2と同様に、エスケープする必要があることがわかります。

これらの番号は、強調表示された正規表現(括弧内に表示する必要があります)を表します。

  1. 1 represents the beginning of each line up to the comma.
  2. 2 is a placeholder for everything that is right of the comma to the end of the line.

目的の出力は、SecondColumn(姓)+コンマ+スペース+ FirstColumn(名)の形式で示されます。お好きなように自由に変更してください。

13.別の一致が見つかった場合にのみ単語を置き換える

特定の単語のすべてのインスタンス、またはランダムないくつかのインスタンスを置き換えることが、正確に必要なものではない場合があります。別の一致が見つかった場合は、おそらく置換を実行する必要があります。

たとえば、同じ行にservicesという単語が見つかった場合にのみ、startをstopに置き換えたい場合があります。そのシナリオでは、次のようになります。

We need to start partying at work,
but let’s remember to start all services first.

1行目では、2行目とは対照的に、サービスという単語がその行に表示されないため、startはstopに置き換えられません。

# sed '/services/ s/start/stop/g' msg.txt

14.一度に2つ以上の置換を実行する

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を他のツールと組み合わせて、より強力なコマンドを作成することもできます。たとえば、TIP#4の例を使用して、 ip route コマンドの出力からIPアドレスを抽出してみましょう。

まず、 src という単語がある行のみを印刷します。次に、複数のスペースを1つのスペースに変換します。最後に、9番目のフィールド(フィールド区切り文字として単一のスペースを考慮)を切り取ります。ここで、IPアドレスは次のとおりです。

# ip route show | sed -n '/src/p' | sed -e 's/  */ /g' | cut -d' ' -f9

以下の画像は、上記のコマンドの各ステップを示しています。

概要

このガイドでは、毎日のシステム管理タスクに役立つ15のsedのヒントとコツを共有しました。あなたが定期的に使用し、私たちや他のコミュニティと共有したい他のヒントはありますか?

その場合は、以下のコメントフォームを使用してお知らせください。質問やコメントも大歓迎です-私たちはあなたからの連絡を楽しみにしています!