awk コマンドとは?
awk
は、テキストファイルの各行をフィールド単位で処理し、条件に応じて整形・抽出・集計を行うことができる強力なテキスト処理ツールです。
主にログ解析、CSV整形、フィールド抽出などに利用されます。
基本構文
awk 'パターン { アクション }' ファイル名
例:
awk '{print $1}' file.txt
サンプルデータ
以下のようなデータがファイルにあると仮定します:
file.txt
ID001 DataA 100
ID002 DataB 120
ID003 DataC 90
/etc/passwd(例)
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000::/home/user1:/bin/bash
scores.txt
Alice 120
Bob 140
Carol 90
主な機能とキーワード
キーワード | 説明 |
---|---|
print | 出力 |
$1, $2... | フィールド指定(1列目、2列目…) |
NR | 現在の行番号 |
NF | 各行のフィールド数 |
BEGIN | 入力処理前に1回だけ実行 |
END | 入力処理後に1回だけ実行 |
よく使うオプションと記法
-F
区切り文字を指定(デフォルトは空白)'...'
で囲んだ中で{print $N}
のように処理を記述$0
は行全体、$1
,$2
はフィールドif
,for
,while
などC言語風の構文も使用可能
使用例と出力サンプル
1列目を表示
$ awk '{print $1}' file.txt
ID001
ID002
ID003
区切り文字が :
の場合(/etc/passwd)
$ awk -F ':' '{print $1}' /etc/passwd
root
user1
行番号付きで出力
$ awk '{print NR, $0}' file.txt
1 ID001 DataA 100
2 ID002 DataB 120
3 ID003 DataC 90
フィールド数が3以上の行だけ表示
$ awk 'NF >= 3' file.txt
条件付き出力(3列目が100より大きい)
$ awk '$3 > 100 {print $1, $3}' file.txt
ID002 120
ヘッダーをスキップ(1行目以外)
$ awk 'NR > 1 {print $1, $2}' file.txt
ID002 DataB
ID003 DataC
BEGIN / END ブロック使用
$ awk 'BEGIN {print "START"} {print $1} END {print "DONE"}' file.txt
START
ID001
ID002
ID003
DONE
よくあるエラーと対処
エラー例 | 原因 | 対処法 |
---|---|---|
awk: syntax error | ' の不一致またはブロック記法ミス | 引数を ' ' で正しく囲む |
フィールド数が一致しない | 区切り文字が違う | -F で正しい区切り文字を指定する |
まとめ
awk
はフィールドベースでデータ抽出や整形ができる高機能ツール$1
,NR
,NF
,BEGIN
などを活用すると柔軟な処理が可能- CSVやログ処理に最適で、シェルスクリプトとも相性が良い
参考リンク
- https://man7.org/linux/man-pages/man1/awk.1.html
- https://www.grymoire.com/Unix/Awk.html
- https://www.gnu.org/software/gawk/manual/gawk.html