1.awkとは
awk(オーク)はスクリプト・インタプリタで、空白などで区切られたテキストの処理、演算機能もあるプログラミング言語であるが、Linuxのコマンドのように扱うことができる。
2.動作環境
ここでの実行環境は次の通り。
・VirtualBox Ubuntu 16.04.7 LTS
・awkのバージョン
$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040
3.awkの基本
3.1 awkの基本構文
(1)awkコマンドの書式
awk [オプション] [コマンド] [ファイルのパス]
・awkの主なオプション
-f ファイル名 awkスクリプトが書かれたファイルを指定する
-F 区切り文字 区切り文字を指定する(デフォルトは空白文字)
-v 変数名=値 変数を定義する
awkはテキストファイルをレコード(行)ごとに処理を行い、フィールド(列)に対する処理を記述する。フィールド(列)に関しては下記の組み込み変数で指定する。
・組み込み変数
$1, $2, …, $n, … : 第n列目のデータ
NF: フィールド(列)の数(1からスタート)
NR: 行番号(1からスタート)
(2)awkコマンドの使い方
コマンドはパターンとアクションに分けて、”awk ‘パターン {アクション}’ [ファイルのパス]”で、テキストファイルを1行ずつ読み、パターンに合致した行に対して、アクションで指定された内容を実行する。
パターンを指定しないで”awk ‘{アクション}’ [ファイルのパス]”としたときは全ての行が処理の対象となる。
(例)data.txtのファイルの内容を表示する
data.txt
1 apple1
2 orange2
3 Grape3
・$0を使用することで全てのフィールド(列)を参照。
$ awk ‘{print $0}’ ./data.txt
1 apple
2 orange
3 Grape
・$1を使用することでフィールド1(列1)を参照。
$ awk ‘{print $1}’ data.txt
1
2
3
・$1 $2を使用することでフィールド1(列1)とフィールド2(列2)を参照。
$ awk ‘{print $1 $2}’ ./data.txt
1apple
2orange
3Grape
・$1と$2の間に文字を挿入
$ awk ‘{print $1 “/” $2}’ ./data.txt
1/apple
2/orange
3/Grape
・フィールド1(列1)とフィールド2(列2)を”,”で区切った場合(デフォルトはスペース区切り)-Fオプション
data.txt
1,apple
2,orange
3,Grape
$ awk -F , ‘{print $1 $2}’ ./data.txt
1apple
2orange
3Grape
・’コマンド’に「パターン」を含むとき
awk ‘パターン { アクション }’ [ 入力ファイルのパス ]
awk ‘$1==1 {print $1, $2}’ ./data.txt
1 apple
(3)パターンの組み合わせ
パターン1 && パターン2:パターン1とパターン2の両方に合致
$ awk ‘$1==1 && $2==”apple” {print $1, $2}’ ./data.txt
1 apple
パターン1 || パターン2:パターン1またはパターン2に合致
$ awk ‘$1==1 || $1==2 {print $1, $2}’ ./data.txt
1 apple
2 orange
(4)BEGIN(前処理)とEND(後処理)
テキストの処理を開始する前に実行したい処理がある場合は”BEGIN {アクション}”で指定し、最終行の処理の後の処理は”END {アクション}”で指定する。
$ awk ‘BEGIN{ i=0 } {print ++i,$0 } END{ print i,” 行” }’ ./data.txt
1 1 apple
2 2 orange
3 3 Grape
3 行
(5)awk用のファイルで処理(-fオプション)
(4)項のコマンドをファイルにする
sample1.awk
BEGIN{
i=0
}
{
print ++i,$0
}
END{
print i," 行"
}
実行
$ awk -f sample1.awk ./data.txt
1 1 apple
2 2 orange
3 3 Grape
3 行
(6)スクリプトとして実行する
(5)項で作成したawk用のファイルの1行目に”#! /usr/bin/awk -f”を書く
#! /usr/bin/awk -f
BEGIN{
i=0
}
{
print ++i,$0
}
END{
print i," 行"
}
スクリプトファイルの実行権限を設定する
$ chmod +x sample1.awk
$ ./sample1.awk ./data.txt
1 1 apple
2 2 orange
3 3 Grape
3 行
3.2 C言語のプログラムからawkスクリプトファイルを実行
・data.txt
1,apple
2,orange
3,Grape
・sample1.awk
#! /usr/bin/awk -f
BEGIN{
i=0
}
{
print ++i,$0
}
END{
print i," 行"
}
・awk_test.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ret=system("./sample1.awk ./data.txt");
printf("system()戻り値:%d\n",ret);
return 0;
}
・awk_test.cをコンパイルし、実行
Linux の system 関数はプログラムの起動に成功すると0を返し、失敗すると-1を返す。
$ gcc -o awk_test awk_test.c
$ ./awk_test
1 1,apple
2 2,orange
3 3,Grape
3 行
system()戻り値:0
The end