Awk と正規表現を使用してファイル内のテキストまたは文字列をフィルタリングする方法
Unix/Linux で特定のコマンドを実行して文字列またはファイルからテキストを読み取ったり編集したりする場合、ほとんどの場合、出力を対象の特定のセクションにフィルタリングしようとします。ここで正規表現を使用すると便利です。
こちらもお読みください: 10 の便利な Linux チェーン演算子と実践的な例
正規表現とは何ですか?
正規表現は、複数の文字シーケンスを表す文字列として定義できます。正規表現について最も重要なことの 1 つは、正規表現を使用すると、コマンドやファイルの出力をフィルターしたり、テキスト ファイルや構成ファイルのセクションを編集したりできることです。
正規表現の特徴
正規表現は次のもので構成されます。
- スペース、アンダースコア (_)、A ~ Z、a ~ z、0 ~ 9 などの通常の文字。
通常の文字に展開されるメタ文字には、次のものが含まれます。
(.)
は、改行を除く任意の 1 文字と一致します。
(*)
は、その直前にある 0 個以上の文字の存在と一致します。[character(s) ]
は、character(s) で指定された文字のいずれかと一致します。また、ハイフン(-)
を使用して、次のような文字の範囲を意味することもできます。[a-f]
、[1-5]
など。^
これは、ファイル内の行の先頭と一致します。$
はファイル内の行末と一致します。\
これはエスケープ文字です。
テキストをフィルタリングするには、awk などのテキスト フィルタリング ツールを使用する必要があります。 awk は独自のプログラミング言語と考えることができます。ただし、awk の使用に関するこのガイドの範囲では、これを単純なコマンド ライン フィルタリング ツールとして取り上げます。
awk の一般的な構文は次のとおりです。
awk 'script' filename
'script'
は、awk によって理解され、ファイル filename に対して実行されるコマンドのセットです。
これは、ファイル内の特定の行を読み取り、その行のコピーを作成し、その行でスクリプトを実行することによって機能します。これがファイル内のすべての行で繰り返されます。
'script'
の形式は '/pattern/action'
です。パターンは正規表現、アクションは> は、行内で指定されたパターンを見つけたときに awk が実行する処理です。
Linux で Awk フィルタリング ツールを使用する方法
次の例では、awk の機能で上で説明したメタ文字に焦点を当てます。
awk を使用する簡単な例:
以下の例では、パターンが指定されていないため、ファイル /etc/hosts 内のすべての行を出力します。
awk '//{print}'/etc/hosts
パターンで Awk を使用します。
以下の例では、パターン localhost
が指定されているため、awk は /etc/hosts
ファイル内の localhost を持つ行と一致します。
awk '/localhost/{print}' /etc/hosts
パターン内で (.) ワイルドカードを使用した Awk の使用
(.)
は、以下の例の loc、localhost、localnet を含む文字列と一致します。
つまり* l some_single_character c *ということです。
awk '/l.c/{print}' /etc/hosts
パターン内で (*) 文字を使用した Awk の使用
以下の例のように、localhost、localnet、lines、capable を含む文字列と一致します。
awk '/l*c/{print}' /etc/localhost
また、(*)
が検出できる最長の一致を取得しようとしていることがわかります。
これを示すケースを見てみましょう。正規表現 t*t
を考えてみましょう。これは、文字 t
で始まり t
で終わる文字列と一致することを意味します。以下の行:
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint.
パターン /t*t/
を使用すると、次の可能性が得られます。
this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
/t*t/
ワイルドカード文字の (*)
により、awk は最後のオプションを選択できます。
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
set [ 文字 ] で Awk を使用する
たとえば、セット [al1]
を考えます。ここで、awk は文字 a
、l
、または 1
を含むすべての文字列に一致します。ファイル /etc/hosts の 1 行にあります。
awk '/[al1]/{print}' /etc/hosts
次の例は、K
または k
で始まり、その後に T
が続く文字列と一致します。
awk '/[Kk]T/{print}' /etc/hosts
範囲内の文字を指定する
awk で文字を理解する:
[0-9]
は単一の数字を意味します[a-z]
は、単一の小文字と一致することを意味します[A-Z]
は、単一の大文字と一致することを意味します[a-zA-Z]
は単一の文字に一致することを意味します[a-zA-Z 0-9]
は、単一の文字または数字と一致することを意味します
以下の例を見てみましょう。
awk '/[0-9]/{print}' /etc/hosts
上の例では、ファイル /etc/hosts のすべての行に少なくとも 1 つの数値 [0-9]
が含まれています。
(^) メタ文字を含む Awk を使用する
以下の例のように、指定されたパターンで始まるすべての行と一致します。
awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts
($) メタ文字を含む Awk を使用する
これは、指定されたパターンで終わるすべての行と一致します。
awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts
(\) エスケープ文字を使用して Awk を使用する
これにより、その後に続く文字をリテラルとして受け取ることができます。つまり、それをそのまま考慮することができます。
以下の例では、最初のコマンドはファイル内のすべての行を出力します。2 番目のコマンドは、$25.00 を含む行と一致させたいため、何も出力しませんが、エスケープ文字は使用されていません。
エスケープ文字を使用して $ をそのまま読み取るため、3 番目のコマンドは正しいです。
awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt
まとめ
これはawk コマンド ライン フィルタリング ツールのすべてではありません。上記の例は awk の基本操作です。次のパートでは、awk の複雑な機能の使用方法について説明します。最後までお読みいただきありがとうございます。追加や説明がございましたら、コメント欄にコメントを投稿してください。