ウェブサイト検索

Linux システム管理タスクに関する Sed コマンドの 15 のヒント


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

この記事では、有名なストリーム エディタであるsed についてレビューし、前述の目的などを達成するためにそれを使用するための 15 のヒントを共有します。

Sedコマンドとは何ですか?

'sed' コマンド (ストリーム エディターの略) は、テキスト ストリームを操作する多用途で強力なテキスト操作ツールで、ユーザーはデータに対して検索、置換、挿入などのさまざまな操作を実行できます。消去。 「Sed」は正規表現を使用してテキスト操作のパターンを定義し、バッチ編集タスクやスクリプト内のテキスト処理に使用できます。

その注目すべき機能の 1 つはインプレース編集で、ファイルを直接変更したり、変更を加えながらバックアップ コピーを作成したりできます。 「Sed」 は、システム管理者、プログラマー、およびコマンド ラインでテキスト変換やデータ操作のタスクを扱う人にとって不可欠なツールです。

以下に、いくつかの一般的な 'sed' コマンドと例を示します。

1. ファイルの行範囲を表示する

head や tail などのツールを使用すると、ファイルの下部または上部を表示できます。中央のセクションを表示する必要がある場合はどうすればよいでしょうか?次の sed ワンライナーは、tecmint.txt の行 5 から 10 を返します。

sed -n '5,10p' tecmint.txt

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

一方、特定の範囲を除いたファイル全体を印刷したい場合もあります。 tecmint.txt から行 2035 を除外するには、次の手順を実行します。

sed '20,35d' myfile.txt

3. 不連続な線と範囲の表示

連続していない一連の行、または複数の範囲に興味がある可能性があります。 tecmint.txt の行 5 ~ 710 ~ 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

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

6. ファイルからコメントを削除する

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

Apache 設定ファイルから空の行または # で始まる行を削除するには、次の手順を実行します。

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

キャレット記号の後に続くシャープ記号 (^#) は行の先頭を示し、^$ は空白行を表します。縦棒はブール演算を示しますが、バックスラッシュは縦棒をエスケープするために使用されます。

この特定のケースでは、Apache 設定ファイルの一部の行の先頭に # が含まれていない行が含まれているため、 *# を使用してこれらの行も削除されます。

7. ファイル内の大文字と小文字を区別しない単語を置換する

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

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

8. ログファイル内の特定のイベントの検索

sed のもう 1 つの用途は、指定された正規表現に一致するファイルの行を出力することです。たとえば、/var に従って、7 月 2 日に行われた認可および認証アクティビティを表示することに興味があるかもしれません。 CentOS サーバーの /log/secure ログ。

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

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

9. ファイルへのスペースまたは空白行の挿入

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

sed G tecmint.txt

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

sed 'G;G' tecmint.txt

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

このヒントは、大規模な構成ファイルを検査する場合に役立つ場合があります。 1 行おきに空白を挿入し、出力を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 内のインスタンスに置き換えて保存します。元のファイルはmyfile.txt.origです。

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

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

12. ファイル内の単語のペアを切り替える

の形式でフルネームが含まれるファイルがあるとします。ファイルを適切に処理するには、を切り替えることができます。

sed を使用すると、これをかなり簡単に行うことができます。

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

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

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

  • 1 は、カンマまでの各行の先頭を表します。
  • 2 は、カンマの右側から行末までのすべてのプレースホルダーです。

目的の出力は、SecondColumn (Last name) + カンマ + スペース + FirstColumn の形式で示されます。 ()。自由に好きなものに変更してください。

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

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

たとえば、サービスという単語が同じ行にある場合にのみ、開始停止に置き換えることができます。そのシナリオでは、次のことが起こります。

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

最初の行では、2 行目とは異なり、サービスという単語が表示されないため、開始停止に置き換えられません。

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

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

1 つのsed コマンドで 2 つ以上の置換を組み合わせることができます。 myfile.txt 内の単語 that と line をそれぞれ Thisverse に置き換えましょう。

通常のsed 置換コマンドの後にセミコロンと 2 番目の置換コマンドを続けると、これがどのように行われるかに注目してください。

sed -i 's/that/this/gi;s/line/verse/gi' myfile.txt

このヒントを次の図に示します。

15. Sed と他のコマンドの組み合わせ

もちろんsed を他の Linux コマンドと組み合わせて、より強力なコマンドを作成することもできます。たとえば、ヒント #4 で示した例を使用して、ip Route コマンドの出力から IP アドレスを抽出してみましょう。

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

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

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

まとめ

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

その場合は、以下のコメントフォームを使用してお気軽にお知らせください。ご質問やご意見も大歓迎ですので、お待ちしております。