awk sed 入門

awk はテキストの置換処理に長けたスクリプト言語です。主にテキストファイルから一部分を抜き出したり、書式を変換するのに使われます。

この文書では awkコマンドの使い方について解説します。

awk はファイルを走査し、指定したパターンのいずれかと一致する行を探します。一致する行が見つかったときに指定されたアクション(動作) を実行します。

目次

実行方法

実行形式には、スクリプトを引数として指定する方法と、スクリプトを格納したファイルの名前を引数で指定する方法があります。

スクリプトを引数として指定する場合、シェルからawkコマンドを次のように実行します。

awk 'スクリプト' [ 入力ファイルのパス ]

入力ファイルのパスは省略可能です。省略した場合は、標準入力が対象となります。

あらかじめスクリプトを格納したテキストファイルを作成しておき、そのスクリプトファイルの名前を引数で指定する方法の場合、シェルからawkコマンドを次のように実行します。

awk -f スクリプトファイルのパス [ 入力ファイルのパス ]

スクリプトファイルの拡張子にとくに決まりはありません。

パターンとアクション

スクリプトはテキストの置換・抽出・変換などのルールを指定するもので、パターン文とアクション文から成り立ちます。スクリプトは次の形式で記述します。

pattern { action }

入力行をパターンと比較して一致したら、アクション文を実行します。 パターンは正規表現で記述することができます。

awk '/井上/ { print $0 }' 住所録

上記の例では、住所録ファイル内で「井上」という文字列を含む行を出力しています。

パターン

パターンは次の3種類で表します。

任意の文字列を正規表現で表すことができます。

/正規表現/

行の末尾は $ で表します。たとえば、最後が mi で終わる行は mi$ と表せます。

$ cat member
umeda erika
yajima maimi
nakajima saki
$ awk '/mi$/ { print $0 }' member
yajima maimi
$

特別なパターンとして、BEGINEND があります。 BEGIN パターンのアクションには、最初の行を読み込む前に実行する処理を記述します。 END パターンのアクションには、最後の行を読み込んだ後に実行する処理を記述します。

BEGIN { print "*** start ***" }
{ 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

最初のフィールドを合計して、合計値と平均値を出力する例を次に示します。

{ sum += $1 }
END { print "合計値", sum, " 平均値", sum/NR }

OFMT

組み込み変数 OFMT は、数値の出力形式を表します。

OFS

組み込み変数 OFS は、出力フィールドセパレータを表します。

ORS

組み込み変数 ORS は、出力レコードセパレータを表します。

RS

組み込み変数 RS は、入力レコードセパレータを表します。

関数

awkコマンドには次に示す組み込み関数があります。

cos

余弦(コサイン)を返す関数です。

number cos(number)

exp

指数を返す関数です。

number exp(number)

getline

number getline()

現入力ファイルの次のレコードを組み込み変数 $0 に設定します。getline 関数は正常終了時には1を、ファイルの終わりに達すると0を、エラー発生時には-1を返します。

index

number index(string, substring)

文字列 string の中で文字列 substring が最初に出現する位置を返します。出現しなければ0を返します。

int

小数点以下を切り捨てた整数を返す関数です。

number int(number)
number int(string)

length

number length(string)

文字列 string の長さを返す関数です。

log

自然対数を返す関数です。

number log(number)

match

number match(string, regexp)

文字列 string の中で正規表現 regexp が最初に出現する位置を返します。出現しなければ 0 を返します。

sin

number sin(number)

number の正弦(サイン)を返す関数です。

split

number split(string, array, fs)

文字列 stringarray[1]array[2]、...、array[n] の配列要素に分割して、値 n を返します。この分割は正規表現 fs によって行われ、fs が指定されていない場合はフィールドセパレータによって行われます。

sprintf

string sprintf(format, expr, expr, ...)

format で指定した printf 形式に従って式の書式を定め、文字列を返します。

sqrt

number sqrt(number)

number の平方根を返す関数です。

substr

string substr(string, m, n)

文字列 string 内の m 番目から始まる長さ n の部分文字列を返します。

アクション

アクションは一連の文です。使用できる文は次のうちのいずれかです。

if

if ( expression ) statement1 [ else statement2 ]

while

while ( expression ) statement

do

do statement while ( expression )

for

for ( expression1 ; expression2 ; expression3 ) statement

for ( var in array ) statement

break

break

if、while、do、for の処理を中止します。

continue

continue

print

print [ expression-list ] [ >expression ]

printf

printf format [ , expression-list ] [ >expression ]

next

next

この行の残りのパターンをスキップします

exit

exit [ 終了ステータス ]

残りの入力をスキップします。終了ステータスは省略できます。

sed

sedは読み込んだテキストをスクリプトに従って編集し、標準出力に書き出すコマンドです。

sed [ -n ] { script | -f scriptfile } [ inputfile ... ]

inputfileには入力するファイル名を指定します。省略した場合は標準入力から読み込みます。

編集コマンドはscriptに直接指定するか、編集コマンドを格納したファイル名をscriptfileに指定します。

sedのスクリプトは次のような書式で記述します。

[address[,address]] command [ arguments ]

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