はじめに
awkはテキスト処理に特化した強力なコマンドであり、ログ解析やデータ整形の現場で頻繁に利用されます。
特にfield(列)とseparator(区切り文字)の概念を理解することが、awkを使いこなすための最初の壁になります。
初心者がつまずきやすいポイントも多いため、実際の挙動をイメージしながら学ぶことが重要です。
本記事ではawkの基本から応用までを順序立てて解説します。
参考:GNU awk
デフォルトの区切り文字(空白とタブ)の挙動と注意点
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
cat dog mouse
one two three
EOF
※タブを入力するにはCtrl+vを押した後にタブキーを押してください
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
apple orange banana
cat dog mouse
one two three
実行コマンド
awk '{print NF}' input.txt
実行結果
3
3
3
実行コマンド
awk '{print "["$2"]"}' input.txt
実行結果
[orange]
[dog]
[two]
仕組み
| 項目 | 内容 |
|---|---|
| デフォルト区切り | 空白(スペース)とタブ |
| 連続区切りの扱い | 連続する空白は1つの区切りとして扱う |
| フィールド変数 | $1, $2, $3 ... |
| フィールド数 | NF で取得可能 |
| 区切りの指定 | -F オプションで変更可能 |
解説
awkのデフォルト区切りは空白とタブで、連続した空白は1つとして扱われる点が重要です。そのため見た目のスペース数に関係なく、フィールドは正しく分割されます。
オプション -F を使用した基本のフィールド区切り指定
ファイル作成
cat << 'EOF' > input.txt
name,age,city
Alice,25,Tokyo
Bob,30,Osaka
Charlie,35,Nagoya
EOF
実行コマンド
awk -F ',' '{print $1, $2}' input.txt
実行結果
name age
Alice 25
Bob 30
Charlie 35
実行コマンド
awk -F ',' 'NR > 1 {print $3}' input.txt
実行結果
Tokyo
Osaka
Nagoya
仕組み
| 要素 | 内容 |
|---|---|
| awk | テキストを行・列で処理するコマンド |
| -F ',' | フィールド区切りをカンマに指定 |
| $1, $2, $3 | それぞれ1列目、2列目、3列目を表す |
| NR > 1 | 1行目(ヘッダー)を除外する条件 |
| {print ...} | 指定したフィールドを出力する処理 |
解説
-F オプションを使うことで、区切り文字を柔軟に変更できます。CSVのようなデータ処理で特に重要な基本機能です。
組み込み変数 FS を用いたスクリプト内での区切り文字定義
ファイル作成
cat << 'EOF' > input.txt
apple,banana,orange
dog,cat,bird
EOF
実行コマンド
awk 'BEGIN { FS="," } { print $1, $2 }' input.txt
実行結果
apple banana
dog cat
実行コマンド
awk -F',' '{ print $1, $3 }' input.txt
実行結果
apple orange
dog bird
仕組み
| 要素 | 内容 |
|---|---|
| FS | フィールド区切り文字を定義する組み込み変数 |
| BEGIN | 入力処理前に一度だけ実行されるブロック |
| $1, $2 | 区切り後の1列目、2列目のデータ |
| -F | コマンドラインから区切り文字を指定するオプション |
解説
FSを設定することで、awkは行を指定した区切り文字で分割して扱います。BEGIN内または-Fオプションで柔軟に区切り文字を変更できます。
複数の異なる文字(カンマ、タブ、セミコロン等)を同時に区切り文字にする方法
ファイル作成
cat << 'EOF' > input.txt
apple,orange;grape banana
dog;cat,bird fish
EOF
※タブを入力するにはCtrl+vを押した後にタブキーを押してください
実行コマンド
awk -F '[,;\t]' '{print $1, $2, $3, $4}' input.txt
実行結果
apple orange grape banana
dog cat bird fish
仕組み
| 要素 | 内容 |
|---|---|
| -F | フィールド区切り文字(Field Separator)を指定 |
| [,;\t] | 正規表現の文字クラス(カンマ・セミコロン・タブを同時指定) |
| $1, $2... | 分割された各フィールドを参照 |
| awk | テキストをフィールド単位で処理するコマンド |
解説
awkでは-Fに正規表現を使うことで複数の区切り文字を同時に扱えます。文字クラス[]を使うのがシンプルで実用的な方法です。
正規表現を利用した柔軟なフィールド分離テクニック
ファイル作成
cat << 'EOF' > input.txt
name:John, age=25; city Tokyo
name:Alice, age=30; city Osaka
name:Bob, age=22; city Nagoya
EOF
実行コマンド
awk -F '[:,=; ]+' '{print $2, $4, $6}' input.txt
実行結果
John 25 Tokyo
Alice 30 Osaka
Bob 22 Nagoya
実行コマンド
awk -F '[,;]' '{print $1 "|" $2 "|" $3}' input.txt
実行結果
name:John| age=25| city Tokyo
name:Alice| age=30| city Osaka
name:Bob| age=22| city Nagoya
仕組み
| 要素 | 内容 |
|---|---|
| -F | フィールド区切り文字を指定 |
| [:,=; ]+ | 「: , = ; スペース」をまとめて区切りとして扱う正規表現 |
| $1, $2 ... | 分割後のフィールド参照 |
| [ ,; ] | カンマとセミコロンで分割 |
| + | 連続する区切りを1つとして処理 |
解説
awkは正規表現を区切りに使うことで、複数形式のデータを柔軟に分割できます。複雑なログや混在フォーマットの解析に非常に有効です。
出力時の区切り文字を制御する組み込み変数 OFS の活用
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
dog cat mouse
EOF
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
apple orange banana
dog cat mouse
実行コマンド
awk 'BEGIN {OFS=","} {print $1, $2, $3}' input.txt
実行結果
apple,orange,banana
dog,cat,mouse
実行コマンド
awk 'BEGIN {OFS="\t"} {print $1, $2, $3}' input.txt
実行結果
apple orange banana
dog cat mouse
仕組み
| 要素 | 説明 |
|---|---|
| FS | 入力フィールド区切り文字(デフォルトは空白) |
| OFS | 出力フィールド区切り文字(print時に使用) |
| $1, $2... | フィールド(列)参照 |
| BEGIN | 入力処理前に一度だけ実行されるブロック |
| フィールドをOFSで連結して出力 |
解説
出力時の区切りはOFSで制御され、printで複数フィールドを指定したときに適用されます。
FSと組み合わせることで入力と出力の形式を柔軟に操作できます。
空文字を区切り文字にして1文字ずつ分解・処理する方法
ファイル作成
cat << 'EOF' > input.txt
Hello
EOF
実行コマンド
awk -v FS="" '{ for(i=1;i<=NF;i++) print $i }' input.txt
実行結果
H
e
l
l
o
仕組み
| 要素 | 内容 |
|---|---|
| FS="" | 区切り文字を空文字に設定(1文字ごとに分割) |
| NF | フィールド数(=文字数) |
| $i | i番目の文字 |
| for文 | 1文字ずつループ処理 |
解説
awkでFS=""を指定すると、各文字がフィールドとして扱われます。これにより1文字単位での処理が簡単に実現できます。
固定長データ(Fixed-width)を扱うための設定
ファイル作成
cat << 'EOF' > input.txt
John 25Engineer
Alice 30Designer
Bob 22Student
EOF
実行コマンド
awk '{name=substr($0,1,10); age=substr($0,11,2); job=substr($0,13,9); print name, age, job}' input.txt
実行結果
John 25 Engineer
Alice 30 Designer
Bob 22 Student
実行コマンド
awk '{print $1, $2}' input.txt
実行結果
John 25Engineer
Alice 30Designer
Bob 22Student
仕組み
| 項目 | 内容 |
|---|---|
| substr($0,1,10) | 1文字目から10文字分(名前) |
| substr($0,11,2) | 11文字目から2文字分(年齢) |
| substr($0,13,9) | 13文字目から9文字分(職業) |
| $0 | 行全体の文字列 |
| 通常のawk | 空白を区切り(field separator)として処理 |
解説
substrで固定位置を切り出す処理が可能。固定長データは文字位置で扱うのが基本。
システムログから特定の列を抽出・成形する
ファイル作成
cat << 'EOF' > input.txt
2026-05-01 INFO user1 login
2026-05-01 ERROR user2 failed
2026-05-02 INFO user3 logout
EOF
実行コマンド
awk '{print $1, $3}' input.txt
実行結果
2026-05-01 user1
2026-05-01 user2
2026-05-02 user3
実行コマンド
awk -F ' ' '{print $2, $4}' input.txt
実行結果
INFO login
ERROR failed
INFO logout
仕組み
| 要素 | 内容 |
|---|---|
| awk | テキスト処理ツール |
| -F | フィールド区切り文字(field separator)を指定 |
| $1, $2... | 各列(フィールド)を表す |
| 指定した列を出力 |
解説
awkは区切り文字で列を分割し、必要なフィールドだけを抽出できる。
ログ解析では特定列の抽出に非常に有効。
awkでfieldとseparator活用のポイントまとめ
awkを使いこなすためにはfieldとseparatorの理解が不可欠です。
-FやFS、OFSを適切に使い分けることで、データの分割から整形までを柔軟に処理できます。
また正規表現を組み合わせることで、実務レベルの複雑なデータにも対応可能になります。
初心者はまずデフォルトの挙動を理解し、徐々に応用的な書き方へとステップアップしていくことが重要です。

