AWK(オーク)使い方の保存版
AWK
AWKは、テキストデータを効率的に処理するためのプログラミング言語およびツールです。
主に空白やカンマで区切られたデータの解析に用いられます。
簡潔なスクリプトで複雑なテキスト操作が可能で、一般的なプログラミングにも対応します。
基本
基本的構文
awk 'pattern {action}' your_filename
pattern: マッチングするパターン(省略可能)
action: マッチングする行に対して実行するアクション(省略可能)
例1: ファイルの各行をそのまま表示
awk '{print}' filename
例2: 各行の第1フィールドと第3フィールドを表示
awk '{print $1, $3}' filename
例3: 第3フィールドの値が100より大きい行のみを表示
awk '$3 > 100 {print $1, $3}' filename
例4: Start of Fileを表示した後、各行をそのまま表示し、最後にEnd of Fileを表示
awk 'BEGIN {print "Start of File"} {print} END {print "End of File"}' filename
一行目と最終行を表示
awk 'NR==1 {print} END {print}' filename
一行目と三行目を表示
awk 'NR==1 || NR==3 { print }' filename
応用
関数の使用
Alice 3
Bob 4
Charlie 5
awk '
function square(x) { return x * x }
{print $1, square($2)}
' sample.txt
出力:
Alice 9
Bob 16
Charlie 25
パターンマッチング
Info: System started
Error: Failed to connect to server
Warning: Low disk space
Error: Invalid user input
Info: System shutdown
awk '/^Error/ {print}' test.log
出力:
Error: Failed to connect to server
Error: Invalid user input
外部コマンドの呼び出し
Alice 3
Bob 4
Charlie 5
awk 'BEGIN {system("date")} {print $1, $2}' sample.txt
出力:
Thu Jun 6 17:58:43 JST 2024
Alice 3
Bob 4
Charlie 5
実用例
CSVファイルのレポート集計
csvファイル解析では、-F, (--field-separator=,) を指定します。
Name,Age,Salary
Alice,30,60000
Bob,25,50000
Charlie,35,70000
例1: 年齢が30以上の人の氏名及び年齢を抽出
awk -F, '$2 >= 30 {print $1, $2}' sample.csv
出力:
Name Age
Alice 30
Charlie 35
例2: 合計給与を計算
awk -F, 'NR > 1 {sum += $3} END {print "Total Salary:", sum}' sample.csv
出力:
Total Salary: 180000
例3: 平均給与を計算
awk -F, 'NR > 1 {sum += $3; count++} END {print "Average Salary:", sum/count}' sample.csv
出力:
Average Salary: 60000
例4: 1列目と2列目を取得し、2列目昇順でソート(ヘッダーあり)
awk -F, 'NR == 1 {print $1, $2}' sample.csv && awk -F, 'NR > 1 {print $1, $2}' sample.csv | sort -k2,2n
出力:
Name Age
Bob 25
Alice 30
Charlie 35
例5: 1列目と2列目を取得し、2列目降順でソート(ヘッダーあり)
awk -F, 'NR == 1 {print $1, $2}' sample.csv && awk -F, 'NR > 1 {print $1, $2}' sample.csv | sort -k2,2nr
出力:
Name Age
Charlie 35
Alice 30
Bob 25
TSVファイルのレポート集計
tsvファイル解析では、-F'\t' (--field-separator='\t') を指定します。
例1: 年齢が30以上の人の氏名及び年齢を抽出
awk -F'\t' '$2 >= 30 {print $1, $2}' sample.tsv
出力:
Name Age
Alice 30
Charlie 35
ファイル変換
例1: CSVをTSVに変換
$番号は列の数だけ記述必要。OFSのタブで列を結合している。
awk 'BEGIN {FS=","; OFS="\t"} {print $1, $2, $3}' sample.csv > sample.tsv
例2: TSVをCSVに変換
$番号は列の数だけ記述必要。OFSのカンマで列を結合している。
awk 'BEGIN {FS="\t"; OFS=","} {print $1, $2, $3}' sample.tsv > sample.csv
ログ集計
2024-06-01 10:00:00 INFO User logged in
2024-06-01 10:05:00 ERROR Failed to load resource
2024-06-01 10:10:00 INFO User logged out
2024-06-01 10:15:00 WARNING Low disk space
2024-06-01 10:20:00 INFO User logged in
例1: ERRORメッセージを抽出
awk '/ERROR/ {print}' sample.log
出力:
2024-06-01 10:05:00 ERROR Failed to load resource
例2: 日時とログレベルを表示
awk '{print $1, $2, $3}' sample.log
出力:
2024-06-01 10:00:00 INFO
2024-06-01 10:05:00 ERROR
2024-06-01 10:10:00 INFO
2024-06-01 10:15:00 WARNING
2024-06-01 10:20:00 INFO
例3: INFOログの回数をカウント
awk '/INFO/ {count++} END {print "INFO count:", count}' sample.log
出力:
INFO count: 3
例4: 各ログレベルの出現回数をカウント
awk '{count[$3]++} END {for (level in count) print level, count[level]}' sample.log
出力:
WARNING 1
ERROR 1
INFO 3
まとめ
今回の保存版では、基本的な使い方から高度な応用例まで幅広くカバーしました。これを活用して、効率的なデータ解析と処理を行いましょう。
Discussion