ウェブサイト検索

LinuxでAwkと正規表現を使ってテキストをフィルタリングする方法


Linuxで文字列やファイルからテキストを読み取ったり編集したりするために特定のコマンドを実行する際、私たちはしばしば出力を特定の興味のあるセクションにフィルタリングしようとします。ここで正規表現を使用することが役立ちます。

正規表現とは何ですか?

正規表現は、いくつかの文字の列を表す文字列として定義できます。正規表現の最も重要な点の一つは、コマンドやファイルの出力をフィルタリングしたり、テキストや設定ファイルの一部を編集したりすることを可能にすることです。

正規表現の特徴

正規表現は以下から構成されています:

  • 普通の文字 とは、スペース、アンダースコア(_)、A-Z、a-z、0-9 のようなものです。
  • メタ文字が通常の文字に展開されるものには、以下が含まれます:

    • (.)は改行以外の任意の1文字にマッチします。
    • (*)は、その前にある即時の文字の零回またはそれ以上の存在に一致します。
    • [ 文字(s) ] は指定された文字のいずれかと一致し、ハイフン (-) を使用すると、[a-f] や [1-5] のように文字の範囲を意味することもできます。
    • ^はファイル内の行の先頭と一致します。
    • $はファイル内の行の終わりに一致します。
    • それはエスケープ文字です。

テキストをフィルタリングするためには、awkのようなテキストフィルタリングツールを使用する必要があります。awkは独自のプログラミング言語のように考えることができます。しかし、このawkの使用に関するガイドの範囲では、単純なコマンドラインフィルタリングツールとして扱います。

awkの一般的な構文は次のとおりです:

awk 'script' filename

'script'は、awkによって理解され、ファイルファイル名で実行されるコマンドのセットです。

これはファイル内の指定された行を読み取り、その行のコピーを作成し、次にその行に対してスクリプトを実行することによって動作します。これをファイル内のすべての行に対して繰り返します。

この'script'は、'/pattern/ action'の形をしており、patternは正規表現であり、actionはawkが行を検索して指定されたパターンを見つけたときに実行するものです。

LinuxでAwkフィルタリングツールを使用する方法

次の例では、私たちが上記でawkの特徴の下で議論したメタキャラクターに焦点を当てます。

awkを使用してファイルのすべての行を印刷する

以下の例は、パターンが指定されていないため、ファイル/etc/hostsのすべての行を印刷します。

awk '//{print}'/etc/hosts

Awkパターンを使用する: ファイル内の「localhost」と一致する行をマッチングする

以下の例では、パターン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は、ファイル/etc/hostsの行に含まれる文字a、l、または1を含むすべての文字列と一致します。

awk '/[al1]/{print}' /etc/hosts

次の例は、Kまたはkで始まり、その後にTが続く文字列にマッチします:

# awk '/[Kk]T/{print}' /etc/hosts 

範囲内の文字を指定する

awkを使って文字を理解する:

  • [0-9]は1桁の数字を意味します
  • [a-z]は1つの小文字の文字と一致することを意味します
  • [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 '/\.00/{print}' deals.txt
awk '/\\.00/{print}' deals.txt

要約

それはawkコマンドラインフィルタリングツールのすべてではありません。上記の例はawkの基本的な操作です。次の部分では、awkの複雑な機能を使用する方法を進めていきます。

包括的なリソースを求めている方のために、私たちはAwkシリーズの記事をすべてまとめた本を作成しました。この本には13章があり、41ページにわたって、基本的および高度なAwkの使用法を実践的な例と共に紹介しています。

商品名価格買う
eBook: 初心者のためのAwk入門ガイド8.99ドル[今すぐ購入]

ご覧いただきありがとうございます。追加や明確な説明が必要な場合は、コメント欄にコメントを投稿してください。

関連記事: