awk はテキストの置換処理に長けたスクリプト言語です。主にテキストファイルから一部分を抜き出したり、書式を変換するのに使われます。
この文書では awkコマンドの使い方について解説します。
awk はファイルを走査し、指定したパターンのいずれかと一致する行を探します。一致する行が見つかったときに指定されたアクション(動作) を実行します。
目次
実行方法
実行形式には、スクリプトを引数として指定する方法と、スクリプトを格納したファイルの名前を引数で指定する方法があります。
スクリプトを引数として指定する場合、シェルからawkコマンドを次のように実行します。
入力ファイルのパスは省略可能です。省略した場合は、標準入力が対象となります。
あらかじめスクリプトを格納したテキストファイルを作成しておき、そのスクリプトファイルの名前を引数で指定する方法の場合、シェルからawkコマンドを次のように実行します。
スクリプトファイルの拡張子にとくに決まりはありません。
パターンとアクション
スクリプトはテキストの置換・抽出・変換などのルールを指定するもので、パターン文とアクション文から成り立ちます。スクリプトは次の形式で記述します。
入力行をパターンと比較して一致したら、アクション文を実行します。 パターンは正規表現で記述することができます。
上記の例では、住所録ファイル内で「井上」という文字列を含む行を出力しています。
パターン
パターンは次の3種類で表します。
- 正規表現
- BEGIN
- END
任意の文字列を正規表現で表すことができます。
行の末尾は $ で表します。たとえば、最後が mi で終わる行は mi$ と表せます。
$ cat member
umeda erika
yajima maimi
nakajima saki
$ awk '/mi$/ { print $0 }' member
yajima maimi
$
特別なパターンとして、BEGIN と END があります。 BEGIN パターンのアクションには、最初の行を読み込む前に実行する処理を記述します。 END パターンのアクションには、最後の行を読み込んだ後に実行する処理を記述します。
{ print $0 }
END { print "*** end ***" }
組み込み変数
$0
組み込み変数 $0 は、入力行(レコード)を表します。
$n
組み込み変数 $n は、n番目のフィールドを表します。
最初の2フィールドを逆順に出力する例を次に示す。
$ awk '{ print $2, $1 }' member
erika umeda
maimi yajima
saki nakajima
FILENAME
組み込み変数 FILENAME は、現入力ファイル名を表します。
FS
組み込み変数 FS は、入力フィールドセパレータの正規表現を表します。
入力フィールドのコンマで区切り、最初の2フィールドを出力する例を次に示す。
BEGIN { FS = "," }
{ print $1, $2 }
NF
組み込み変数 NF は、現レコード中のフィールド数を表します。
NR
組み込み変数 NR は、現レコード番号を表します。
特別パターン END においては現レコード番号は最後のレコード番号となりますので、つまり全レコード数(入力ファイルの行数)となります。
行番号と入力行を出力するawkスクリプトの例を示す。
$ awk '{ print NR, $0 }' member
1 umeda erika
2 yajima maimi
3 nakajima saki
最初のフィールドを合計して、合計値と平均値を出力する例を次に示します。
END { print "合計値", sum, " 平均値", sum/NR }
OFMT
組み込み変数 OFMT は、数値の出力形式を表します。
OFS
組み込み変数 OFS は、出力フィールドセパレータを表します。
ORS
組み込み変数 ORS は、出力レコードセパレータを表します。
RS
組み込み変数 RS は、入力レコードセパレータを表します。
関数
awkコマンドには次に示す組み込み関数があります。
cos
余弦(コサイン)を返す関数です。
exp
指数を返す関数です。
getline
現入力ファイルの次のレコードを組み込み変数 $0 に設定します。getline 関数は正常終了時には1を、ファイルの終わりに達すると0を、エラー発生時には-1を返します。
index
文字列 string の中で文字列 substring が最初に出現する位置を返します。出現しなければ0を返します。
int
小数点以下を切り捨てた整数を返す関数です。
number int(string)
length
文字列 string の長さを返す関数です。
log
自然対数を返す関数です。
match
文字列 string の中で正規表現 regexp が最初に出現する位置を返します。出現しなければ 0 を返します。
sin
number の正弦(サイン)を返す関数です。
split
文字列 string を array[1]、array[2]、...、array[n] の配列要素に分割して、値 n を返します。この分割は正規表現 fs によって行われ、fs が指定されていない場合はフィールドセパレータによって行われます。
sprintf
format で指定した printf 形式に従って式の書式を定め、文字列を返します。
sqrt
number の平方根を返す関数です。
substr
文字列 string 内の m 番目から始まる長さ n の部分文字列を返します。
アクション
アクションは一連の文です。使用できる文は次のうちのいずれかです。
if
while
do
for
break
if、while、do、for の処理を中止します。
continue
printf
next
この行の残りのパターンをスキップします
exit
残りの入力をスキップします。終了ステータスは省略できます。
sed
sedは読み込んだテキストをスクリプトに従って編集し、標準出力に書き出すコマンドです。
inputfileには入力するファイル名を指定します。省略した場合は標準入力から読み込みます。
編集コマンドはscriptに直接指定するか、編集コマンドを格納したファイル名をscriptfileに指定します。
sedのスクリプトは次のような書式で記述します。
memberという名前のファイルがあり、次のようなテキストが格納されているとします。
umeda erika yajima maimi nakajima saki
sedの基本動作は、入力されたテキストをそのまま標準出力へ書き出すことです。空のスクリプトを指定した例を次に示します。
$ sed '' member umeda erika yajima maimi nakajima saki $
sedコマンドの引数に -n オプションを指定すると、基本動作が何も出力しないようになります。この場合、コマンドで処理しない限り何も標準出力に書き出されなくなります。
$ sed -n '' member $
入力されたテキストのうち2行目を削除するには、addressに 2、commandに d を指定します。
$ sed '2 d' member umeda erika nakajima saki $
入力されたテキストのうち1行目から2行目までの行を削除するには、addressに 1,2、commandに d を指定します。
$ sed '1,2 d' member nakajima saki $
入力されたテキストのうち最後の行を削除するには、addressに $、commandに d を指定します。
$ sed '$ d' member umeda erika yajima maimi $
addressを省略した場合、すべての入力行に対してコマンドが実行されます。すべての入力行に対して、maという文字列をMAに変換する場合、次のように指定します。
$ sed 's/ma/MA/' member umeda erika yajiMA maimi nakajiMA saki
変換が行われるのは、1行の入力につき最初の1箇所だけです。すべて変換するには次のようにします。
$ sed 's/ma/MA/g' member umeda erika yajiMA MAimi nakajiMA saki
maという文字列をMAに変換した行だけを出力するには次のようにします。
ultra28% sed -n 's/ma/MA/p' member yajiMA maimi nakajiMA saki
maという文字列を削除する場合、次のように指定します。
$ sed 's/ma//' member umeda erika yaji maimi nakaji saki