(最終更新月:2023年4月)
✔このような方へ向けて書かれた記事となります
「AWKコマンドってなに?」
「AWKコマンドの使い方を知りたい」
「AWKコマンドの実例が見てみたい」
✔当記事を通じてお伝えすること
- AWKコマンドとは?
- AWKコマンドの基本・書き方
- AWKコマンドの実例
当記事では、AWKコマンドの基本だけでなく、その書き方や具体例まで、丁寧に解説していきます。
ぜひ最後までご覧ください。
awkコマンドについての基礎知識
awkコマンドについての基本をおさえておきましょう。
最低限のことを抑えたうえで、次へ進みます。
- awk コマンドとは
- awk の用途
- コマンドラインでの使い方
- スクリプトファイルを使った使い方
awkコマンドとは
awkコマンドは、テキストファイルを処理するための強力なツールです。
主に、データの検索、抽出、変換、集計などに使用されます。
パターンマッチングとアクションを組み合わせて、簡単に複雑なテキスト処理が実現可能。
例えば、特定の条件に合致する行を抽出したり、特定のフィールドの値を合計す値を出したりできるのです。
awkの用途
awk は、テキストデータを操作する際に非常に便利。
一般的な用途としては、以下のようなものがあります。
- ログ解析: サーバーやアプリケーションのログファイルから特定のイベントやエラーを検出
- CSVファイル処理: CSVデータの抽出、変換、集計をおこなう
- データの集計: テキストファイルから特定の条件に合致するデータを集計
- レポート生成: テキストデータを加工して、レポートやグラフに適した形式に変換
- テキストフォーマットの変換: XML、JSON、HTML などのテキストデータを他の形式に変換
コマンドラインでの使い方
awk コマンドは、コマンドラインで直接実行することができます。
例えば、次のようなコマンドを実行すると、ファイル “data.txt” から3番目のフィールドを出力します。
awk '{ print $3 }' data.txt
このコマンドでは、波括弧 ({}) の中にあるアクション `print $3` が実行されます。
$3が3列名(3番目のフィールド)を指しています。
これにより、”data.txt” ファイルの各レコードから3番目のフィールドが出力されます。
スクリプトファイルを使った使い方
awk コマンドは、スクリプトファイルに記述して実行することもできます。
例えば、次の内容を “myscript.awk” という名前のファイルに保存します。
{ print $1, $2 }
次に、このスクリプトファイルを使って “data.txt” ファイルから1番目と2番目のフィールドを出力します。
awk -f myscript.awk data.txt
この方法を使用すると、より複雑な処理や大規模なプログラムを記述しやすくなります。
awkコマンドの基本用語5選
awkコマンドで使われる用語について解説します。
検索時などにも活用できるので、必ず目を通してください。
- フィールド
- レコード
- パターン
- アクション
- 組み込み変数
フィールド
フィールドとは、テキストファイル内のデータを区切る単位。
デフォルトでは、空白文字(スペースやタブ)で区切られた単語が1つのフィールドとして扱われます。
フィールドの区切り文字は、FS(Field Separator)という組み込み変数で指定可能です。
例えば、CSVファイルを処理する場合、FSをカンマに設定することで各フィールドを正しく認識できます。
レコード
レコードは、テキストファイル内のデータを行単位で区切るもので、通常1行が1つのレコードになります。
レコードの区切り文字は、RS(Record Separator)という組み込み変数で指定できます。
デフォルトでは、RS は改行文字に設定されていますが、例えば複数行にわたるデータを1つのレコードとして扱いたい場合には、RS を適切な値に変更することができます。
パターン
パターンは、特定の条件にマッチするレコードを選択するためのものです。
正規表現や比較演算子を用いて、条件を指定することができます。
例えば、特定の文字列が含まれるレコードや、特定のフィールドの値が一定の範囲内にあるレコードなどが抽出可能です。
アクション
アクションは、パターンにマッチしたレコードに対して実行する処理のことです。
フィールドの値を出力したり、変数の値を更新したり、条件分岐やループを使って複雑な処理をおこなえます。
アクションは波括弧 ({}) で囲んで記述され、パターンとセットで指定してください。
組み込み変数
awkには、いくつかの組み込み変数が用意されており、これらを利用してプログラムの挙動を制御したり、データの処理をおこなえます。
主要な組み込み変数を見ていきましょう。
変数名 | 説明 |
---|---|
$0 | 現在のレコード(行)全体の内容を表します。 |
$1, $2, … | レコード内の各フィールド(列)の値を表します。$1 は1番目のフィールド、$2 は2番目のフィールド、といった具合です。 |
NF | 現在のレコード内のフィールド数を表します。 |
NR | 現在のレコードの行番号(ファイル内での順序)を表します。 |
FNR | 現在のレコードのファイル内での行番号を表します(複数ファイルを処理する場合に使用)。 |
FS | フィールドの区切り文字(セパレータ)を指定します。デフォルトは空白文字(スペースやタブ)。 |
RS | レコードの区切り文字を指定します。デフォルトは改行文字。 |
OFS | 出力時のフィールド区切り文字を指定します。デフォルトは空白文字(スペース)。 |
ORS | 出力時のレコード区切り文字を指定します。デフォルトは改行文字。 |
FILENAME | 現在処理中のファイル名を表します。 |
ARGC | コマンドライン引数の数を表します。 |
ARGV | コマンドライン引数の配列を表します。 |
awkの基本的な文法
awkの基本的な文法を見ていきましょう。
以下の5つはよく使われる構文で、それぞれ書き方があるのです。
- 変数
- ループ
- 条件分岐
- 組み込み関数
- 正規表現を使ったパターンマッチング
変数
awkでは、変数を使用してデータを一時的に保存したり、計算結果を保持したりすることができます。
変数には、文字列や数値の代入が可能。
例えば、次のコマンドは “data.txt” ファイルの各レコードから1番目のフィールドの値を合計します。
awk '{ sum += $1 } END { print sum }' data.txt
「$1」とは、レコード(行)の1番目のフィールド(列)を示しています。
例えば、行に「itc tokyo」とあったとすると、$1は「itc」で、$2は「tokyo」です。
ループ
awkでは、for ループや while ループを使って繰り返し処理がおこなえます。
例えば、次のコマンドは “data.txt” ファイルの各レコードから、全フィールドの値を出力します。
awk '{ for (i = 1; i <= NF; i++) print $i }' data.txt
NFとは、組み込み変数で、フィールド(列)数のこと。
条件分岐
awkでは、if 文を使って条件分岐も可能です。
例えば、次のコマンドは “data.txt” ファイルの各レコードから、3番目のフィールドが 100 より大きいレコードのみを出力します。
awk '{ if ($3 > 100) print }' data.txt
組み込み関数
awk には、さまざまな組み込み関数が用意されています。
これらの関数を使って、文字列操作や数値計算、配列操作などが可能。
関数名 | 説明 |
length([string]) | 引数で与えられた文字列(省略時は $0)の長さを返します。 |
substr(string, m[, n]) | 文字列 string の m 番目の文字から n 文字分を抽出して返します(n を省略すると、文字列の終わりまでが対象になります)。 |
index(string, substring) | 文字列 string に substring が最初に現れる位置を返します(見つからない場合は 0)。 |
split(string, array[, separator]) | 文字列 string を separator で区切り(省略時は空白文字)、分割した結果を配列 array に格納します。分割された要素の数を返します。 |
match(string, regexp) | 文字列 string に正規表現 regexp がマッチする位置を返します(見つからない場合は 0)。 |
sub(regexp, replacement[, string]) | 文字列 string(省略時は $0)中の正規表現 regexp に最初にマッチする部分を replacement に置換します。置換が行われた回数(0 または 1)を返します。 |
gsub(regexp, replacement[, string]) | 文字列 string(省略時は $0)中の正規表現 regexp にマッチするすべての部分を replacement に置換します。置換が行われた回数を返します。 |
sprintf(format, …) | 指定された書式 format に従って引数を整形し、結果の文字列を返します。 |
int(expression) | 式 expression の整数部分を返します。 |
sin(x) | 弧度法で表される角 x の正弦(sine)を返します。 |
cos(x) | 弧度法で表される角 x の余弦(cosine)を返します。 |
atan2(y, x) | y/x の逆正接(arctangent)を返します。 |
exp(x) | e の x 乗(指数関数)を返します。 |
log(x) | x の自然対数(底が e の対数)を返します。 |
sqrt(x) | x の平方根を返します。 |
rand() | 0 から 1 までの範囲でランダムな小数を返します。 |
srand([x]) | 乱数生成器を初期化します。引数 x が指定されている場合、その値を種として使用します(省略時は現在の時刻を種として使用)。前の乱数生成器の種を返します。 |
いくつか例を見てみましょう。
ファイル内の各レコードの長さを表示する
awk '{ print length }' data.txt
ファイル内の各レコードの1番目のフィールドの部分文字列(2文字目から3文字分)を表示する
awk '{ print substr($1, 2, 3) }' data.txt
ファイル内の各レコードの1番目のフィールドに “example” が含まれるかどうかを判定する
awk '{ if (index($1, "example") > 0) print "Found"; else print "Not found" }' data.txt
正規表現を使ったパターンマッチング
awkには、正規表現を使ったパターンマッチング機能も備わっています。
例えば、次のコマンドは “data.txt” ファイルの各レコードから、2番目のフィールドに “example” という文字列が含まれるレコードを抽出します。
awk '$2 ~ /example/ { print }' data.txt
実践的なawkコマンドの例
awkコマンドの実例を見ていきます。
具体例を参考にしつつ、目的を達成しましょう。
- フィールドを指定してデータを表示する
- 条件に合致するレコードのみを表示する
- データの集計や加工
- ファイルの内容を編集する
- カンマで分割する
- 小文字に置換する
フィールドを指定してデータを表示する
次のコマンドは、”data.txt” ファイルから1番目と3番目のフィールドを表示します。
awk '{ print $1, $3 }' data.txt
条件に合致するレコードのみを表示する
次のコマンドは、”data.txt” ファイルから、2番目のフィールドが “example” という文字列を含むレコードを抽出します。
awk '$2 ~ /example/ { print }' data.txt
データの集計や加工
次のコマンドは、”data.txt” ファイルから1番目のフィールドの値を合計し、平均値を算出します。
awk '{ sum += $1 } END { print sum / NR }' data.txt
ファイルの内容を編集する
次のコマンドは、”data.txt” ファイルの内容を編集し、2番目のフィールドを大文字に変換した結果を “output.txt” に出力します。
awk ‘{ $2 = toupper($2); print }’ data.txt > output.txt
カンマで分割する
ファイル内の各レコードの2番目のフィールドをカンマで分割し、その第1要素を表示します。
awk '{ split($2, arr, ","); print arr[1] }' data.txt
小文字に置換する
ファイル内の各レコードについて、1番目のフィールドを小文字に置換して表示します。
awk '{ gsub(/[A-Z]/, tolower("&"), $1); print $1 }' data.txt
awkコマンドと他のコマンドとの連携
他のコマンドとの連携についても見ておくべきです。
組み合わせることでより効率的に作業できます。
- grep コマンドとの連携
- sed コマンドとの連携
- sort コマンドとの連携
- 外部コマンドの利用
grep コマンドとの連携
次のコマンドは、”data.txt” ファイルから “example” という文字列を含むレコードを抽出し、3番目のフィールドを表示します。
grep 'example' data.txt | awk '{ print $3 }'
grepコマンドについてはこちらの記事もどうぞ。
sed コマンドとの連携
次のコマンドは、”data.txt” ファイルの内容を編集し、1番目のフィールドに “example” という文字列が含まれる場合、そのフィールドを “EXAMPLE” に置換します。
awk '{ if ($1 ~ /example/) $1 = "EXAMPLE"; print }' data.txt | sed 's/example/EXAMPLE/g'
sedコマンドについてはこちらの記事もどうぞ。
sort コマンドとの連携
次のコマンドは、”data.txt” ファイルから1番目のフィールドを抽出し、ソートして出力します。
awk '{ print $1 }' data.txt | sort
外部コマンドの利用
awkでは、外部コマンドの実行も可能。
例えば、次のコマンドは “data.txt” ファイルの各レコードから、1番目のフィールドを含むディレクトリを作成します。
awk '{ system("mkdir " $1) }' data.txt
複数ファイルの処理
awkコマンドは、複数のファイルを処理したいときにも対応できます。
以下の2パターンをご覧ください。
- ファイルのマージ
- 各ファイルから特定のデータを抽出
ファイルのマージ
次のコマンドは、”file1.txt” と “file2.txt” の内容をマージし、1番目のフィールドを表示します。
awk '{ print $1 }' file1.txt file2.txt
各ファイルから特定のデータを抽出
次のコマンドは、”file1.txt” と “file2.txt” から、2番目のフィールドが “example” という文字列を含むレコードを抽出します。
awk 'FNR == 1 { print "Processing file:", FILENAME } $2 ~ /example/ { print }' file1.txt file2.txt
awkコマンドの応用例
awkコマンドをより応用した使い方を見ていただきます。
場面別で使える方法です。
- ログファイルの解析
- CSVファイルのデータ処理
- テキストデータのフォーマット変換
ログファイルの解析
次のコマンドは、”access.log” ファイルから、404 エラーのリクエストを抽出します。
awk '$9 == "404" { print }' access.log
CSVファイルのデータ処理
次のコマンドは、”data.csv” ファイルから、カンマ区切りの3番目のフィールドを表示します。
awk -F, '{ print $3 }' data.csv
テキストデータのフォーマット変換
次のコマンドは、”data.txt” ファイルのタブ区切りのデータを、カンマ区切りに変換します。
awk -v OFS=, '{ $1 = $1; print }' data.txt
まとめ:awkコマンドでテキスト操作の効率が倍増
当記事では、以下の内容をお伝えしてきました。
- awk コマンドの概要
- 基本用語
- 使い方
- 基本文法
- 実践的な例
- 他のコマンドとの連携
- 複数ファイルの処理や応用例
awk コマンドは、テキストデータの処理や編集に非常に強力で、柔軟性があります。
組み込み関数や組み込み変数を利用して、さまざまなデータ操作やテキスト処理をおこなうことも可能です。
ほかのコマンドとも連携しつつ、効率良い作業を目指しましょう。