awk コマンド

構造化されたデータを操作するためのパターンスキャンとテキスト処理言語です。

概要

awk は強力なテキスト処理ツールで、入力の各行をレコードとして、各単語をフィールドとして扱います。CSV、ログ、テーブルなどの構造化されたテキストファイルからデータを抽出・操作するのに優れています。コマンドは次のパターンに従います: awk 'パターン {アクション}' ファイル

オプション

-F, --field-separator

フィールド区切り文字を指定します(デフォルトは空白)

$ echo "apple,orange,banana" | awk -F, '{print $2}'
orange

-f, --file

コマンドラインではなくファイルからAWKプログラムを読み込みます

$ cat script.awk
{print $1}
$ awk -f script.awk data.txt
First
Second
Third

-v, --assign

プログラム実行前に変数に値を割り当てます

$ awk -v name="John" '{print "Hello, " name}' /dev/null
Hello, John

-W, --compat, --posix

POSIX互換モードで実行します

$ awk -W posix '{print $1}' data.txt
First
Second
Third

使用例

基本的なフィールド表示

$ echo "Hello World" | awk '{print $1}'
Hello

CSVデータの処理

$ cat data.csv
John,25,Engineer
Mary,30,Doctor
$ awk -F, '{print "Name: " $1 ", Job: " $3}' data.csv
Name: John, Job: Engineer
Name: Mary, Job: Doctor

パターンマッチングによる行のフィルタリング

$ cat /etc/passwd | awk -F: '/root/ {print $1 " has home directory " $6}'
root has home directory /root

合計の計算

$ cat numbers.txt
10 20
30 40
$ awk '{sum += $1} END {print "Sum:", sum}' numbers.txt
Sum: 40

ヒント:

組み込み変数

AWKには、NR(現在のレコード番号)、NF(現在のレコードのフィールド数)、FS(フィールド区切り文字)などの便利な組み込み変数があります。

$ echo -e "a b c\nd e f" | awk '{print "Line", NR, "has", NF, "fields"}'
Line 1 has 3 fields
Line 2 has 3 fields

条件付き処理

if-else文を使用して条件付き処理を行います:

$ cat ages.txt
John 25
Mary 17
Bob 32
$ awk '{if ($2 >= 18) print $1, "is an adult"; else print $1, "is a minor"}' ages.txt
John is an adult
Mary is a minor
Bob is an adult

複数のコマンド

セミコロンで複数のコマンドを区切ります:

$ echo "Hello World" | awk '{count=split($0,arr," "); print "Words:", count; print "First word:", arr[1]}'
Words: 2
First word: Hello

よくある質問

Q1. awk、sed、grepの違いは何ですか?

A. grepがパターンを検索し、sedがテキスト変換を実行するのに対し、awkは変数、関数、算術演算などのプログラミング機能を含む構造化データ処理用に設計されています。

Q2. awkで複数のファイルを処理するにはどうすればよいですか?

A. awkコマンドの後にファイルを列挙するだけです:awk '{print $1}' file1.txt file2.txt

Q3. awkは複数行処理を扱えますか?

A. はい、RS(レコード区切り文字)変数を使用します:awk 'BEGIN{RS="";FS="\n"}{print $1}' file.txt は段落で区切られたテキストを処理します。

Q4. awkで正規表現を使用するにはどうすればよいですか?

A. 正規表現はスラッシュの間に配置します:awk '/pattern/ {print}' file.txt

参考文献

https://www.gnu.org/software/gawk/manual/gawk.html

改訂履歴