Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxのawkコマンド使い方ガイド【実例付きでわかりやすく解説】

このガイドでは、Linuxにおけるawkコマンドの基本的な使い方から実践的なテクニックまで、日常業務ですぐに役立つ具体例を交えて詳しく解説します。

awkとは?

AWKは、Linuxオペレーティングシステムで利用できるテキスト検索・加工のためのツールであり、同時にスクリプト言語でもあります。

awkコマンドは、ファイル内からパターン(pattern)に一致するテキストを検索し、一致したテキストに対して特定のアクション(action)を実行します。

awkは、大量のテキストファイルや多数のファイルからデータを抽出し、レポートを作成するのに非常に便利なツールです。例えば、ログファイルの処理や、温度プローブなどのデータ収集デバイスが長期間にわたって記録した大量データの解析などに活用できます。データベースクエリの出力結果の処理にも使えます。

awkは別途インストールする必要はありません。ほとんどのLinuxシステムには標準で搭載されています。

awkの基本構文

ターミナルでawkコマンドを使用する際の基本構文は以下の通りです。

awk [PROGRAM] [INPUT FILES]

各要素の意味は次の通りです。

  • [PROGRAM]:検索パターンと実行するアクションを記述します。awkに処理させたいプログラム本体にあたります。
    • -fオプションを使えば、コマンドラインに直接書く代わりに、プログラムをテキストファイルとして指定することも可能です。
  • [INPUT FILES]:awkに処理させたいファイルを指定します。スペース区切りで複数のファイル、ディレクトリへのパス、ファイル名のパターンなどを指定できます。
    • 入力ファイルを指定しない場合、awkは別のコマンドからパイプで渡された出力を処理します。

awkの主なオプション

awkコマンドには以下のようなオプションを指定できます。

オプション 説明
-f program-file プログラムをコマンドラインではなくファイルから読み込みます。-fオプションは複数指定可能です。
-F value フィールドセパレータ(FS)を指定した値に設定します。
-v var=value プログラム内で使用する変数varに値valueを代入します。

お使いのバージョンのawk固有のオプションについては、以下のコマンドでマニュアルを確認してください。

man awk

プログラムのアクションと変数

awkに渡すプログラムによって、テキストファイルへの処理内容が決まります。awkプログラムは以下の形式で記述します。

CONDITION { ACTION }
CONDITION { ACTION }
...

CONDITION(条件)はマッチさせるテキストのパターン、ACTION(アクション)は一致したテキストに対して実行する処理です。条件とアクションの組み合わせはいくつでも記述できます。

アクションについて

アクションには、計算、変数の操作、関数の呼び出しなどを含むコマンドを記述できます。一部の組み込み関数は実装依存のため、詳細はマニュアルで確認することをおすすめします。

レコード(Records)

awkは、特にOPTIONSで指定しない限り、テキストファイルの各行を1つのレコード(record)として扱います。

フィールド(Fields)

awkは、特に指定しない限り、空白文字(スペースやタブ)を区切りとして、レコード内のフィールド(field)を識別します。

組み込み変数

awkには、自分で定義しなくてもすぐに使える組み込み変数が多数用意されており、よくある処理シーンをカバーしています。

変数 意味
$0 レコード全体を表します
$1, $2, $3 … フィールド変数 – レコード内の個々のフィールドのテキスト/値を保持します
NR(Number of Records) これまでに読み込んだ全ファイル合計の入力レコード数(現在のカウント)
FNR(File Number of Records) 現在のファイル内で読み込んだ入力レコード数 – 新しいファイルの処理を開始するたびに0にリセットされます
NF(Number of Fields) 現在の入力レコードのフィールド数 – 最後のフィールドは$NF、後ろから2番目は$(NF-1)のように参照できます
FILENAME 現在処理中の入力ファイル名
FS(Field Separator) レコード内のフィールドを区切る文字 – デフォルトではスペースとタブが含まれます
RS(Record Separator) ファイル内のレコードを区切る文字 – デフォルトは改行です
OFS(Output Field Separator) awkの出力でフィールドを区切る文字 – デフォルトは半角スペース1つです
ORS(Output Record Separator) awkの出力でレコードを区切る文字 – デフォルトは改行です
OFMT(Output ForMaT) 数値出力のフォーマット – デフォルトは「%.6g」です

awkの実用例

ここからの例では、以下の内容を含むflowers.txtというテキストファイルを使用します。

red rose
yellow daffodil
pink flamingo
white rose
blue iris
white lily
red peony
yellow orchid
purple foxglove

ファイルの内容を表示する

次のawkコマンドは、print関数を使ってファイルの内容をターミナルに出力します。

awk '{print}' flowers.txt

ファイルのレコード数(行数)を表示する

awk 'END { print NR }' sample.txt

この例では、ファイルの行数が出力されます。

9

正規表現でテキストを検索する

次のコマンドは、「rose」に関する行だけを出力します。

awk '/rose/' flowers.txt

検索するテキストの定義にはREGEX(正規表現)の構文が使われている点に注意してください。

このコマンドの出力結果は以下の通りです。

red rose
white rose

正規表現の応用

awk '/^p/' flowers.txt

このコマンドは、「p」で始まるレコードのみを出力します。

pink flamingo
purple foxglove

フィールド変数を使う

フィールド変数を使えば、「pで始まるレコードの最初のフィールドだけ」を出力することもできます。

awk '/^p/ {print $1;}' flowers.txt

出力結果:

pink
purple

他のコマンドの出力を処理する

他のLinuxシェルコマンドの出力をパイプでawkに渡して処理することができます。この例では、ls -lコマンド(現在のディレクトリの内容を一覧表示)の出力から、5番目のフィールド(ファイルサイズ)を取り出しています。

ls -l | awk '{print $5}'

出力例:

3104
3072
224
256

…(現在のディレクトリにあるファイルの数やサイズによって結果は変わります)。

組み込み変数を使う

awk '{print NR "-" $2 }' flowers.txt

このコマンドは、現在のレコード番号(ファイルの行番号)に続けて2番目のフィールド(花の名前)を出力します。

1-red rose
2-yellow daffodil
3-pink flamingo
4-white rose
5-blue iris
6-white lily
7-red peony
8-yellow orchid
9-purple foxglove

条件の組み合わせ

条件アクション&&を使って組み合わせることができます。次のコマンドは、最初のフィールドに「red」というテキストが含まれ、かつ最後のフィールドが5文字未満であるすべてのレコードを出力します。

awk '$1 ~ /red/ && length($NF) < 5 { print }' flowers.txt

ポイント:

  • 2番目のフィールドを参照するために$NFを使用しています($2の代わり)。この例では最後のフィールドが2番目のフィールドと同じ、つまりNF(フィールド数)と等しいためです。
  • length()関数はフィールドの文字数を計算するために使っています。

そのため、サンプルファイルからは一致するレコードが1件だけ返されます。

red rose

まとめ

awkがほぼすべてのLinuxディストリビューションに標準搭載されているのには理由があります。テキストの検索・処理に欠かせない定番ツールであり、システムに異常が発生した際のログエントリの素早い調査や、研究用に取得したデータの加工などに幅広く活用できるからです。

大量のテキストファイルに対して単純な検索・置換以上のことをやろうとしたことがあれば、個別に置換コマンドを実行することなく、プログラム的に一括で置換や更新を行えることの価値を実感できるはずです。

ぜひ他のLinux Tips記事もチェックしてみてください!

  1. Linuxのssコマンドでネットワーク接続を監視する方法【基本から実践テクニックまで】

    Linuxを使っていると、ネットワークの状態をもっと詳しく知りたい場面に必ず出会います。そうしたニーズに応えられるツールは数多く存在しますが、中には扱いが複雑なものもあります。ssコマンドは多くのLinuxマシンに標準でインストールされているため、その使い方を知っておくと非常に便利です。ssコマンドとは?2文字だけのコマンド名は一見謎めいて見えますが、実際はとてもシンプルです。多くのLinux/Unixコマンドと同じように、コマンド名はその機能を表す略語になっています。「ss」は「Socket Statistics(ソケット統計)」の略です。Socket Statisticsは、従来のnets

  2. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行