1. 概要

この記事では、コマンドラインツール grep sed 、およびawkについて説明します。 特に、それらの間の機能の違いを研究します。

2. バックグラウンド

Linuxでのテキスト処理に関しては、非常に便利な3つのツールは、 grep sed 、およびawkです。 まったく異なるツールですが、それらの機能は単純なシナリオでは重複しているようです。 たとえば、ファイル内のパターンを見つけて、一致するものを標準出力に出力するには、それらすべてがそれを実行できることがわかります。

ただし、この単純な演習を超えて拡張すると、grepは単純なテキストのマッチングと印刷にのみ適していることがわかります。

一方、 sedは、テキストの照合と印刷に加えて、substitutionなどの追加のテキスト変換コマンドを提供します。

最後に、これらのツールの中で最も強力な awk は、存在しない多数の機能を提供するスクリプト言語です。前の2つで。

始める前に、この記事の目的は、これら3つのツールの違いを明確にすることであるということを知っておくことが重要です。したがって、ここで取り上げる例は、それぞれで可能なことのほんの一部にすぎません。ツール、特にsedおよびawkの場合。

3. テキストファイル

説明を簡単にするために、テキストファイルlog.txtを定義しましょう。

Timestamp       Category        Message
1598843202      INFO    Booting up system
1598843402      INFO    Booting up critical service: Authorization
1598843502      INFO    System booted successfully
1598853502      INFO    User admin requested access for userlist
1598863888      ERROR   User annonymous attempt to access protected resource without credentials
1598863891      INFO    System health check status: passed
1598863901      ERROR   Requested resource not found
1598864411      INFO    User admin logged out

4. grep

grepコマンドは、正規表現パターンに一致する行を検索し、それらの一致する行を標準出力に出力します。 特定のパターンが特定の入力に存在するかどうかをすばやく確認する方法が必要な場合に役立ちます。

4.1. 基本構文

grepの構文は次のとおりです。

grep [OPTIONS] PATTERN [FILE...]

PATTERNは、FILE引数で指定されたファイルのコンテンツで検索するものを定義する正規表現パターンです。 OPTIONS オプションのパラメーターは、grepの動作を変更するフラグです。

4.2. 正規表現パターンに一致する行の検索

抽出したいとしましょうエラーからのイベント log.txt。 私たちはそれを行うことができます grep

$ grep "ERROR" log.txt
1598863888	ERROR	User annonymous attempt to access protected resource without credentials
1598863901	ERROR	Requested resource not found

ここで何が起こるかというと、greplog.txtの行をスキャンし、ERRORという単語を含む行を標準出力に出力します。

4.3. マッチを反転する

-v フラグを使用して、一致を反転できます。

grep -v "INFO" log.txt

上記のコマンドを実行すると、 grepは、パターンINFOに一致する行を除くlog.txtのすべての行を出力します。

4.4. 前行または後行の印刷

場合によっては、マッチングの前後の行を印刷したいことがあります。 一致後に5行を印刷するには、フラグ-Aを使用できます。

grep -A 5 ERROR log.txt

一方、一致する前に5行を印刷するには、フラグ-Bを使用できます。

grep -B 5 ERROR log.txt

最後に、フラグ -C を使用すると、一致前の5行と一致後の5行の両方を印刷できます。

grep -C 5 ERROR log.txt

5. sed

sed コマンドは、文字のストリームを処理するストリームエディタです。 sedで最も一般的に知られているsubstituteコマンドなど、テキスト処理の目的でより多くのオプションを提供するため、grepよりも強力なツールです

5.1. 基本構文

sedコマンドの一般的な構文は次のとおりです。

sed [OPTIONS] SCRIPT FILE...

OPTIONS は、sedに適用して動作を変更できるオプションのフラグです。 次に、 SCRIPT 引数は、FILE引数で指定されたファイルのすべての行で実行されるsedスクリプトです。

5.2. スクリプト構造

sedスクリプトの構造は次のとおりです。

[addr]X[options]

ここで、 addr は、テキストファイルの行に適用される条件です。 これは、固定数または行の内容に対してテストされて処理される正規表現パターンにすることができます。

次に、 X 文字は、実行するsedコマンドを表します。 たとえば、1文字で示される置換コマンド。

最後に、追加のオプション sed コマンドに渡して、その動作を指定できます。

5.3. sedgrepとして使用する

手始めに、sedを使用してgrepの機能を複製する方法を見てみましょう。

sed -n '/ERROR/ p' log.txt

デフォルトでは、sedはスキャンしているすべての行を標準の出力ストリームに出力します。 この自動印刷を無効にするには、フラグ-nを使用できます。

次に、フラグ -n の後に続くスクリプトを実行し、log.txtのすべての行で正規表現パターンERRORを探します。 一致するものがある場合、スクリプトで p コマンドを使用しているため、sedはその行を標準出力に出力します。 最後に、 log.txt を、sedが最後の引数として処理するファイルの名前として渡します。

5.4. 一致した文字列を置換で置換

sedのsubstituteコマンドの構造は次のとおりです。

's/pattern/replacement/'

pattern の行に一致するものがある場合、sedはそれをreplacementに置き換えます。

たとえば、log.txtERRORという単語をCRITICALweという単語に置き換えたい場合は次のように実行できます。

sed 's/ERROR/CRITICAL/' log.txt

5.5. その場でファイルを変更する

sed で操作中のファイルの変更を保持したい場合は、フラグ-iをサフィックスとともに使用できます。 変更を加える前に、 sed はファイルのバックアップを作成し、このバックアップファイル名にサフィックスを追加します。 たとえば、次のコマンドを実行すると、次のようになります。

sed -ibackup 's/ERROR/CRITICAL/' log.txt

log.txt は複製され、 sed が変更を適用する前に、log.txtbackupに名前が変更されます。

5.6. 特定の行番号に制限する

sed コマンドを制限して、スクリプトのaddrスロットを使用して特定の行番号でのみ動作するようにすることができます。

sed '3 s/ERROR/CRITICAL/' log.txt

これにより、log.txtの3行目でのみスクリプトが実行されます。

さらに、行番号の範囲を指定できます。

sed '3,5 s/ERROR/CRITICAL/' log.txt

この場合、 sed は、 log.txtの3行目から5行目でスクリプトを実行します。

さらに、正規表現パターンで境界を指定できます。

sed -n '3,/ERROR/ p' log.txt

ここで、 sed は、 log.txt の行を、行番号3から始まり、パターン / ERROR/に一致する最初の行が見つかったときに終了する行を出力します。 。

6. awk

awk は、Perlに匹敵する本格的なプログラミング言語です。 文字列、算術、時間操作のための多数の組み込み関数を提供するだけでなく、ユーザーが通常のスクリプト言語と同じように独自の関数を定義できるようにします。 それがどのように機能するかのいくつかの例を見てみましょう。

6.1. 基本構文

awk構文は次の形式です。

awk [options] script file

ファイルのすべての行に対してスクリプトを実行します。 スクリプトの構造を拡張してみましょう。

'(pattern){action}'

pattern は、すべての入力行に対してテストされる正規表現パターンです。 行がpatternと一致する場合、awkはその行のactionで定義されたスクリプトを実行します。 パターン条件がない場合、アクションはすべての行で実行されます

6.2. grepawkで複製する

sed で行ったように、awkを使用してgrepの機能をエミュレートする方法を見てみましょう。

awk '/ERROR/{print $0}' log.txt

上記のコードは、log.txtファイルで正規表現パターンERRORを見つけ、一致する行を標準出力に出力します。

6.3. 一致する文字列を置き換える

同様に、awkの組み込みメソッド gsub を使用して、と同様に、すべてのERRORオカレンスをCRITICALに置き換えることができます。 sed の例:

awk '{gsub(/ERROR/, "CRITICAL")}{print}' log.txt

メソッドgsubは、引数として正規表現パターンと置換文字列を取ります。 次に、awkはその行を標準出力に出力します。

6.4. ドキュメントへのヘッダーとフッターの追加

awk には、ファイルの任意の行の処理を開始する前に実行されるBEGINブロックがあります。 一方、 END ブロックもあり、すべての行が処理された後に何を実行するかを定義できます。

BEGINブロックとENDブロックを使用して、テキストドキュメントにヘッダーとフッターを追加しましょう。

$ awk 'BEGIN {print "LOG SUMMARY\n--------------"} {print} END {print "--------------\nEND OF LOG SUMMARY"}' log.txt
LOG SUMMARY
--------------
Timestamp	Category	Message
1598843202      INFO    Booting up system
1598843402      INFO    Booting up critical service: Authorization
1598843502      INFO    System booted successfully
1598853502      INFO    User admin requested access for userlist
1598863888      ERROR   User annonymous attempt to access protected resource without credentials
1598863891      INFO    System health check status: passed
1598863901      ERROR   Requested resource not found
1598864411      INFO    User admin logged out
--------------
END OF LOG SUMMARY

6.5. カラム操作

行と列の構造(CSVスタイル)を持つドキュメントの処理は、awkが本当に輝いているときです。 たとえば、最初と2番目の列を簡単に印刷し、log.txtの3番目の列をスキップできます。

awk '{print $1, $2}' log.txt

6.6. カスタムフィールドセパレータ

デフォルトでは、awkは空白を区切り文字として処理します。 処理テキストが空白以外の区切り文字(コンマなど)を使用している場合は、フラグ-Fを使用して指定できます。

awk -F "," '{print $1, $2}' log.txt

6.7. 算術演算

awk の算術演算を実行する機能により、テキストファイルに関する数値情報を簡単に収集できます。 たとえば、log.txtでのERRORイベントの発生数を計算してみましょう。

awk '{count[$2]++} END {print count["ERROR"]}' log.txt

上記のスクリプトでは、awkは各個別の値Category列のカウントを変数countに格納します。 次に、スクリプトは最後にcount値を出力します。

6.8. 数値比較

本格的なスクリプト言語であるため、awkは10進値を容易に理解します。 これにより、スクリプトで値を単純な文字列ではなく数値として解釈する必要がある場合に、テキスト処理が簡単になります。

たとえば、タイムスタンプ1598863888より古いすべてのログエントリを取得したいとします。より大きなコンパレータを使用できます。

$ awk '{ if ($1 > 1598863888 ) {print $0} }' log.txt
1598863891      INFO    System health check status: passed
1598863901      ERROR   Requested resource not found
1598864411      INFO      User admin logged ou

出力から、コマンドは指定されたタイムスタンプより後に記録されたログ行のみを出力することがわかります。

7. 結論

この記事では、 grep sed 、およびawkの基本的な紹介から始めました。 次に、単純なテキストのスキャンとマッチングでのgrepの使用法を示しました。 次に、テキストを変換するときに、sedgrepよりもどのように役立つかを確認しました。

最後に、awkgrepおよびsed機能を複製すると同時に、高度なテキスト処理のためのより多くの機能を提供する方法を示しました。