awkコマンドとは?その基本やさまざまな書き方を実例付きで解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年4月)

✔このような方へ向けて書かれた記事となります

「AWKコマンドってなに?」

「AWKコマンドの使い方を知りたい」

「AWKコマンドの実例が見てみたい」

✔当記事を通じてお伝えすること

  • AWKコマンドとは?
  • AWKコマンドの基本・書き方
  • AWKコマンドの実例

当記事では、AWKコマンドの基本だけでなく、その書き方や具体例まで、丁寧に解説していきます。

ぜひ最後までご覧ください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

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 コマンドは、テキストデータの処理や編集に非常に強力で、柔軟性があります。

組み込み関数や組み込み変数を利用して、さまざまなデータ操作やテキスト処理をおこなうことも可能です。

ほかのコマンドとも連携しつつ、効率良い作業を目指しましょう。

created by Rinker
¥2,970 (2024/12/03 22:52:42時点 楽天市場調べ-詳細)
タイトルとURLをコピーしました