このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:テキストをアクションで編集する:awkコマンド

awkコマンドの概要

 awkは、テキストの検索、抽出、加工などの編集操作を行うための非常に強力なコマンドです。発音は「オーク」となります。このコマンドは、シェルから直接編集操作を実行し、その結果を表示する点では、sedと似ています。しかし、awkは単なる非対話型エディタであるsedとは異なり、より高機能なテキスト処理を可能にするプログラミング言語としての要素も持っています。

 現在では、RubyやPythonといったスクリプト言語が本格的なテキスト処理に利用されることが多くなっていますが、awkもまだ多くの場面で活躍しています。awkを習得すれば、テキスト処理がより効率的かつ簡単に行えるため、覚えておく価値があるでしょう。

awkコマンドの形式

awksedと同様に、以下の形式で実行します。

【書式】
awk '<スクリプト>' <対象ファイル>

  • <スクリプト>awkで実行する命令を指定します。シングルクォートで囲みます。
  • <対象ファイル>:処理対象のファイルを指定します。

 対象ファイルを指定しない場合は標準入力から読み込んでフィルタとして動作します。また、入力テキストを1行ずつ読み込んでスクリプトに指定された処理を行う点もsedと同じです。ただし、awkは指定できるスクリプトの内容がsedよりもずっと高機能です。

awkのスクリプトは、パターンアクションの2つで構成されています。

  • パターン:アクションを実行するかどうかの条件を記述します。この条件は、対象のテキストを1行読み込むごとに判定されます。なお、awkでは処理中に読み込んでいく1行の入力テキストをレコードと呼びます。
  • アクション:テキストの抽出や置換、削除などの実際のテキスト編集処理を記述します。パターンにマッチした場合にのみ、このアクションが実行されます。

【書式】awkのスクリプトの部分
パターン { アクション }

パターンは省略することが可能で、その場合はすべてのレコードに対してアクションが実行されます。

awkの動作

awkがどのように動作するのかを示したのが次の流れの解説です。なお、スクリプトの部分はシェルに解釈されないようにシングルクォートで囲んでおきます。

$ awk 'パターン { アクション }' ファイル名

1.入力ファイルの読み込み

  • ファイルの内容を1行ずつレコードとして読み込みます。
  • 例えば、以下のようなテキストファイルを処理対象とします。

sample.txtの内容

Col
Cool
Coool
Cooool!!
CoolCool
Japan Cool
Japan Hot

2.レコードの処理

  • awkは1行ずつレコードを読み込みます。まず、最初のレコード(行)「Col」を読み込みます。
  • 読み込んだレコードがパターンにマッチするかどうかをチェックします。

3.パターンに基づいた処理

  • マッチする場合
    パターンに一致した場合、指定されたアクションを実行します(例:行の出力、置換、削除など)。
  • マッチしない場合
    アクションは実行されず、次のレコードに進みます。

4.次の行の処理

  • 1つのレコード(行)の処理が終了すると、次の行「Cool」に進みます。
  • これをファイルの終わりまで繰り返します。

awkの実行例

内部の処理の流れを見てもわかりにくいでしょうから、いくつかawkの実行例を見てみましょう。

サンプルファイルの作成

user01@ubuntu:~$ nano result.txt

result.txtの内容

john@example.com 85 90 80
sara@example.com 78 88 85
mike@example.com 92 76 88
linda@example.com 85 95 90
sam@example.com 70 80 75

例1:第2フィールドと第3フィールドのみを表示

 例1では、スペース区切りのファイルresult.txtから、第2フィールドと第3フィールドのみを取り出して表示しています。この例ではパターンを省略して全行にアクションを実行しています。

user01@ubuntu:~$ awk '{print $2, $3}' result.txt

出力結果

85 90
78 88
92 76
85 95
70 80

解説

  • $2$3:それぞれ第2フィールドと第3フィールドを表します。
  • {print $2, $3}:第2フィールドと第3フィールドを表示するアクションです。
  • パターンの省略:パターンを省略しているため、全行に対してアクションが実行されます。

結果

result.txtの各行から、第2フィールドと第3フィールドのみが抽出されて表示されています。

例2:第1フィールドがsから始まるレコードのみ、行番号付きで表示

user01@ubuntu:~$ awk '$1 ~ /^s/ {print NR, $0}' result.txt

出力結果

2 sara@example.com 78 88 85
5 sam@example.com 70 80 75

解説

  • パターン部分$1 ~ /^s/
    $1 :第1フィールドを表します(ここではメールアドレス)。
    ~ :左辺が右辺の正規表現にマッチするかを判定します。
    /^s/sで始まる文字列を表す正規表現です。
  • アクション部分{print NR, $0}
    NR:現在処理している行番号を表します。
    $0:現在の行全体を表します。
    print NR, $0:行番号と行全体を表示します。

結果

第1フィールドがsから始まるレコードのみが、行番号付きで表示されています。

不要なファイルを削除

作業が終わったら、不要になったファイルを削除します。

user01@ubuntu:~$ rm result.txt

まとめ

  • awkコマンドは、テキストの検索や抽出・加工などの編集操作を行うための強力なツールです。
  • スクリプトの構成
    パターン:アクションを実行する条件を指定します。
    アクション:実際に実行する処理を指定します。
  • フィールドの利用
    $1$2、…:各フィールドを表します。
    $0:現在の行全体を表します。
    NR:現在の行番号を表します。
  • 正規表現の活用
    ・パターン部分で正規表現を使用して、柔軟な条件指定が可能です。
  • 活用例
    ・特定のフィールドを抽出して表示する。
    ・条件に合致するレコードのみを処理する。
    ・行番号や計算結果を含めて表示する。

 awkを使いこなすことで、テキスト編集操作が格段に楽になります。ログ解析やデータ加工など、さまざまな場面で活用してみてください。