I'm very pleased to announce the release of our new website and documentation using the new toolchain with Hugo and AsciiDoctor. To get more information about the new toolchain please read the FreeBSD Documentation Project Primer[1], Hugo docs[2] and AsciiDoctor docs[3]. Acknowledgment: Benedict Reuschling <bcr@> Glen Barber <gjb@> Hiroki Sato <hrs@> Li-Wen Hsu <lwhsu@> Sean Chittenden <seanc@> The FreeBSD Foundation [1] https://docs.FreeBSD.org/en/books/fdp-primer/ [2] https://gohugo.io/documentation/ [3] https://docs.asciidoctor.org/home/ Approved by: doceng, core
507 lines
9.1 KiB
Groff
507 lines
9.1 KiB
Groff
.\" $FreeBSD$
|
|
.de EX
|
|
.\" WORD: expression 「式」と訳す (nawk.1)
|
|
.nf
|
|
.ft CW
|
|
..
|
|
.de EE
|
|
.br
|
|
.fi
|
|
.ft 1
|
|
..
|
|
awk
|
|
.TH AWK 1
|
|
.CT 1 files prog_other
|
|
.SH 名称
|
|
awk \- パターン指向型検索・処理言語
|
|
.SH 書式
|
|
.B awk
|
|
[
|
|
.BI \-F
|
|
.I fs
|
|
]
|
|
[
|
|
.BI \-v
|
|
.I var=value
|
|
]
|
|
[
|
|
.I 'prog'
|
|
|
|
|
.BI \-f
|
|
.I progfile
|
|
]
|
|
[
|
|
.I file ...
|
|
]
|
|
.SH 解説
|
|
.I awk
|
|
は
|
|
.IR prog
|
|
または 1 つ以上の
|
|
.B \-f
|
|
.IR progfile
|
|
の形式で指定されたファイルにおいて
|
|
指定されたパターンの組にマッチした行を逐語的に、各
|
|
.I file
|
|
から検索します。
|
|
.I file
|
|
の行がパターンにマッチした際に実行するアクションを、
|
|
各パターンに対して関連づけることができます。
|
|
各行は全てのパターン-アクション文におけるパターン部と比較され、
|
|
マッチしたパターンそれぞれに関連づけられたアクションが実行されます。
|
|
ファイル名
|
|
.B \-
|
|
は標準入力を意味します。
|
|
.I var=value
|
|
形式の
|
|
.IR file
|
|
はファイル名でなく代入として扱われ、それがファイル名ならば
|
|
開かれるであろうタイミングで実行されます。
|
|
.B \-v
|
|
オプション
|
|
の後に続く
|
|
.I var=value
|
|
は
|
|
.I prog
|
|
が実行される前に代入されます。
|
|
.B \-v
|
|
オプションはいくつあっても構いません。
|
|
.B \-F
|
|
.IR fs
|
|
オプションは入力フィールドセパレータを正規表現
|
|
.IR fs
|
|
に定義します。
|
|
.PP
|
|
入力行は通常空白または正規表現
|
|
.BR FS
|
|
によってフィールドに分解されます。
|
|
フィールドは
|
|
.BR $1 ,
|
|
.BR $2 ,
|
|
\&...
|
|
で表され、
|
|
.B $0
|
|
は行全体を意味します。
|
|
.BR FS
|
|
がヌルだった場合には、入力行は一文字ごとにフィールドに分けられます。
|
|
.PP
|
|
パターン-アクション文は以下のような形式です
|
|
.IP
|
|
.IB pattern " { " action " }
|
|
.PP
|
|
.BI { " action " }
|
|
がない場合には、行を表示します。
|
|
pattern がなかった場合には、常にマッチします。
|
|
パターン-アクション文は改行またはセミコロンで分離されます。
|
|
.PP
|
|
アクションは文の並びです。
|
|
文は以下のうちのどれかです:
|
|
.PP
|
|
.EX
|
|
.ta \w'\f(CWdelete array[式]'u
|
|
.RS
|
|
.nf
|
|
.ft CW
|
|
if(\fI 式 \fP)\fI 文 \fP\fR[ \fPelse\fI 文 \fP\fR]\fP
|
|
while(\fI 式 \fP)\fI 文\fP
|
|
for(\fI 式 \fP;\fI 式 \fP;\fI 式 \fP)\fI 文\fP
|
|
for(\fI var \fPin\fI array \fP)\fI 文\fP
|
|
do\fI 文 \fPwhile(\fI 式 \fP)
|
|
break
|
|
continue
|
|
{\fR [\fP\fI 文 ... \fP\fR] \fP}
|
|
\fI式\fP #\fR 普通は\fP\fI var = 式\fP
|
|
print\fR [ \fP\fI式の並び \fP\fR] \fP\fR[ \fP>\fI 式 \fP\fR]\fP
|
|
printf\fI format \fP\fR[ \fP,\fI 式の並び \fP\fR] \fP\fR[ \fP>\fI 式 \fP\fR]\fP
|
|
return\fR [ \fP\fI式 \fP\fR]\fP
|
|
next #\fR この入力行に関して残りのパターンをスキップします\fP
|
|
nextfile #\fR このファイルの残りをスキップし、次を開き、先頭から始めます\fP
|
|
delete\fI array\fP[\fI 式 \fP] #\fR 配列要素を削除します\fP
|
|
delete\fI array\fP #\fR 配列の全ての要素を削除します\fP
|
|
exit\fR [ \fP\fI式 \fP\fR]\fP #\fR 直ちに終了します; ステータスは \fP\fI式\fP です
|
|
.fi
|
|
.RE
|
|
.EE
|
|
.DT
|
|
.PP
|
|
文はセミコロン、改行、右かっこで終端されます。
|
|
空の
|
|
.I 式の並び
|
|
は
|
|
.BR $0
|
|
を意味します。
|
|
文字列定数は \&\f(CW"\ "\fR でくくられ、その中では通常の C エスケープが
|
|
解釈されます。
|
|
式は文字列や数値を適切に扱い、それらの文字列や数値は
|
|
.B + \- * / % ^
|
|
(指数) や(空白で示される) 結合演算子を使って組み立てられます。
|
|
.B
|
|
! ++ \-\- += \-= *= /= %= ^= > >= < <= == != ?:
|
|
演算子も式の中で使用可能です。
|
|
変数はスカラー、
|
|
(
|
|
.IB x [ i ]
|
|
で表現される) 配列要素、またはフィールドです。
|
|
変数はヌル文字列で初期化されます。
|
|
配列の添字は数字である必要はなく、どのような文字列であっても構いません。
|
|
この機能により連想配列の形態をとることも可能になります。
|
|
.B [i,j,k]
|
|
のように複数の添字を用いることも可能です。
|
|
構成要素は
|
|
.BR SUBSEP
|
|
の値を使って結合されます。
|
|
.PP
|
|
.B print
|
|
文は与えられた引数を現在の出力フィールドセパレータを用いて
|
|
標準出力
|
|
(または
|
|
.BI > file
|
|
あるいは
|
|
.BI >> file
|
|
が使われていた場合にはファイル、
|
|
.BI | cmd
|
|
が使われていた場合にはパイプ) に出力し、
|
|
出力レコードセパレータによって終端します。
|
|
.I file
|
|
と
|
|
.I cmd
|
|
はリテラル名または丸括弧でくくられた式であり、
|
|
異なる文での同一の文字列値は同じファイルをオープンすることを示します。
|
|
.B printf
|
|
文は引数のリストを書式 (
|
|
.IR printf (3)
|
|
参照)
|
|
に従って整形します。
|
|
組み込み関数
|
|
.BI close( expr )
|
|
はファイルまたはパイプ
|
|
.IR expr
|
|
をクローズします。
|
|
組み込み関数
|
|
.BI fflush( expr )
|
|
はバッファリングされているファイルまたはパイプ
|
|
.IR expr
|
|
をフラッシュします。
|
|
.PP
|
|
数学関数
|
|
.BR exp ,
|
|
.BR log ,
|
|
.BR sqrt ,
|
|
.BR sin ,
|
|
.BR cos ,
|
|
.BR atan2
|
|
は組み込みのものです。
|
|
その他の組み込み関数:
|
|
.TF length
|
|
.TP
|
|
.B length
|
|
引数または
|
|
引数がなかった場合には
|
|
.B $0
|
|
を文字列として捉えた長さ。
|
|
.TP
|
|
.B rand
|
|
(0,1) の乱数
|
|
.TP
|
|
.B srand
|
|
.B rand
|
|
用の種を設定し、以前の種を返します。
|
|
.TP
|
|
.B int
|
|
整数値へ切り捨て
|
|
.TP
|
|
.BI substr( s , " m" , " n\fB)
|
|
.I s
|
|
の 1 から数えて
|
|
.IR m
|
|
番目の位置から
|
|
.IR n -文字
|
|
の部分文字列。
|
|
.TP
|
|
.BI index( s , " t" )
|
|
.I s
|
|
中の文字列
|
|
.I t
|
|
が現れる位置、現れなかった場合には 0。
|
|
.TP
|
|
.BI match( s , " r" )
|
|
.I s
|
|
中の正規表現
|
|
.I r
|
|
が現れる位置、現れなかった場合には 0。
|
|
変数
|
|
.B RSTART
|
|
と
|
|
.B RLENGTH
|
|
に、マッチした文字列の位置と長さがセットされます。
|
|
.TP
|
|
.BI split( s , " a" , " fs\fB)
|
|
文字列
|
|
.I s
|
|
を配列要素
|
|
.IB a [1] ,
|
|
.IB a [2] ,
|
|
\&...,
|
|
.IB a [ n ] ,
|
|
に分割し、
|
|
.IR n
|
|
を返します。
|
|
分割は正規表現
|
|
.I fs
|
|
または
|
|
.I fs
|
|
が与えられなかった場合にはフィールドセパレータ
|
|
.B FS
|
|
によって行われます。
|
|
フィールドセパレータが空の文字列だった場合、
|
|
文字列は1文字単位で配列要素へ分割されます。
|
|
.TP
|
|
.BI sub( r , " t" , " s\fB)
|
|
文字列
|
|
.IR s
|
|
中に最初に現れた正規表現
|
|
.I r
|
|
を
|
|
.I t
|
|
に置換します。
|
|
.I s
|
|
が与えられなかった場合には、
|
|
.B $0
|
|
が用いられます。
|
|
.TP
|
|
.B gsub
|
|
.B sub
|
|
と同じですが、現れた全ての正規表現が置換されます。
|
|
.B sub
|
|
と
|
|
.B gsub
|
|
は置換した数を返します。
|
|
.TP
|
|
.BI sprintf( fmt , " expr" , " ...\fB )
|
|
書式
|
|
.I fmt
|
|
にしたがって
|
|
.I expr ...
|
|
を
|
|
.IR printf (3)
|
|
で整形した結果の文字列
|
|
.TP
|
|
.BI system( cmd )
|
|
.I cmd
|
|
を実行して終了状態を返却
|
|
.TP
|
|
.BI tolower( str )
|
|
.I str
|
|
中の全ての大文字を対応する等価の小文字に変換したコピーを返します。
|
|
.TP
|
|
.BI toupper( str )
|
|
.I str
|
|
中の全ての小文字を対応する等価の大文字に変換したコピーを返します。
|
|
.PD
|
|
.PP
|
|
``関数''
|
|
.B getline
|
|
は現在の入力ファイルから次のレコードを
|
|
.B $0
|
|
に設定します。
|
|
.B getline
|
|
.BI < file
|
|
は
|
|
.IR file
|
|
から次のレコードを
|
|
.B $0
|
|
に設定します。
|
|
.B getline
|
|
.I x
|
|
の場合は代わりに変数
|
|
.I x
|
|
に設定します。
|
|
最後に、
|
|
.IB cmd " | getline
|
|
では
|
|
.I cmd
|
|
の出力を
|
|
.BR getline
|
|
にパイプし、
|
|
.B getline
|
|
のそれぞれの呼び出しは
|
|
.IR cmd
|
|
の出力から次の行を返します。
|
|
全ての場合において、
|
|
.B getline
|
|
は入力に成功すると 1 を返し、
|
|
ファイルの終端に達すると 0 を返し、
|
|
エラーになると \-1 を返します。
|
|
.PP
|
|
パターンは任意の数の正規表現や関係式の
|
|
(
|
|
.BR "! || &&"
|
|
による) 論理的組み合わせです。
|
|
正規表現は
|
|
.IR egrep
|
|
のそれと同じです。
|
|
.IR grep (1)
|
|
を参照してください。
|
|
パターン中の単独 (isolated) 正規表現は行全体にかかります。
|
|
正規表現は
|
|
.BR ~
|
|
や
|
|
.BR !~
|
|
演算子を用いて、関係式の中でも使えます。
|
|
.BI / re /
|
|
は変化しない正規表現です。
|
|
パターン中の単独正規表現となる場所以外では、
|
|
どのような文字列 (定数または変数) であっても正規表現として使えます。
|
|
.PP
|
|
パターンはコンマで 2 つのパターンに区切ることができます。
|
|
この場合、1つ目のパターンと2つ目のパターンの間にある全ての行に対して
|
|
アクションがなされます。
|
|
.PP
|
|
関係式は以下のうちのどれかです:
|
|
.IP
|
|
.I 式 matchop 正規表現
|
|
.br
|
|
.I 式 relop 式
|
|
.br
|
|
.IB 式 " in " 配列名
|
|
.br
|
|
.BI ( 式 , 式,... ") in " 配列名
|
|
.PP
|
|
ここで relop は C での 6つの関係演算子のどれか、matchop は
|
|
.B ~
|
|
(マッチする)
|
|
or
|
|
.B !~
|
|
(マッチしない) のうち、どちらか。
|
|
条件は数式、関係式、またはこれらの論理的組み合わせのどれかです。
|
|
.PP
|
|
特別なパターン
|
|
.B BEGIN
|
|
と
|
|
.B END
|
|
は最初の行を読む前と最後の行を読んだあとに制御をつかむのに使用できます。
|
|
.B BEGIN
|
|
と
|
|
.B END
|
|
は他のパターンと組み合わせることはできません。
|
|
.PP
|
|
特別な意味を持つ変数名:
|
|
.TF FILENAME
|
|
.TP
|
|
.B CONVFMT
|
|
数値を変換する際に使用する変換書式
|
|
(デフォルトでは
|
|
.BR "%.6g" )
|
|
.TP
|
|
.B FS
|
|
フィールド分離に使用する正規表現。
|
|
.BI \-F fs
|
|
オプションでも指定できます。
|
|
.TP
|
|
.BR NF
|
|
現在のレコードでのフィールド数
|
|
.TP
|
|
.B NR
|
|
現在のレコードの序数
|
|
.TP
|
|
.B FNR
|
|
現在のファイルでの現在のレコードの序数
|
|
.TP
|
|
.B FILENAME
|
|
現在の入力ファイルの名称
|
|
.TP
|
|
.B RS
|
|
入力レコードセパレータ (デフォルトでは改行)
|
|
.TP
|
|
.B OFS
|
|
出力フィールドセパレータ (デフォルトでは空白)
|
|
.TP
|
|
.B ORS
|
|
出力レコードセパレータ (デフォルトでは改行)
|
|
.TP
|
|
.B OFMT
|
|
数値の出力書式 (デフォルトでは
|
|
.BR "%.6g" )
|
|
.TP
|
|
.B SUBSEP
|
|
多次元配列のセパレータ (デフォルトでは 034)
|
|
.TP
|
|
.B ARGC
|
|
引数のカウント、代入可能
|
|
.TP
|
|
.B ARGV
|
|
引数の配列、代入可能。
|
|
ヌルでないメンバはファイル名として扱われます
|
|
.TP
|
|
.B ENVIRON
|
|
環境変数の配列。添字は名前です。
|
|
.PD
|
|
.PP
|
|
関数は以下のように (パターン-アクション文の位置で) 定義できます:
|
|
.IP
|
|
.B
|
|
function foo(a, b, c) { ...; return x }
|
|
.PP
|
|
パラメータはスカラーの場合は値で、配列名の場合は参照で渡されます。
|
|
関数は再帰的に呼び出し可能です。
|
|
パラメータは関数ローカルで、それ以外の変数はグローバルです。
|
|
ローカル変数は関数定義時に余分なパラメータを加えることで作成できます。
|
|
.SH 使用例
|
|
.TP
|
|
.EX
|
|
length($0) > 72
|
|
.EE
|
|
72文字より長い行を表示します。
|
|
.TP
|
|
.EX
|
|
{ print $2, $1 }
|
|
.EE
|
|
始めの 2 フィールドを逆順で表示します。
|
|
.PP
|
|
.EX
|
|
BEGIN { FS = ",[ \et]*|[ \et]+" }
|
|
{ print $2, $1 }
|
|
.EE
|
|
.ns
|
|
.IP
|
|
同じですが、フィールドをコンマ、空白、タブで区切ります。
|
|
.PP
|
|
.EX
|
|
.nf
|
|
{ s += $1 }
|
|
END { print "sum is", s, " average is", s/NR }
|
|
.fi
|
|
.EE
|
|
.ns
|
|
.IP
|
|
1つ目のカラムを足していき、合計と平均を表示します。
|
|
.TP
|
|
.EX
|
|
/start/, /stop/
|
|
.EE
|
|
start と stop の組み合わせの間の行を表示します。
|
|
.PP
|
|
.EX
|
|
.nf
|
|
BEGIN { # echo(1) をシミュレートします
|
|
for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
|
|
printf "\en"
|
|
exit }
|
|
.fi
|
|
.EE
|
|
.SH 関連項目
|
|
.IR lex (1),
|
|
.IR sed (1)
|
|
.br
|
|
A. V. Aho, B. W. Kernighan, P. J. Weinberger,
|
|
.I
|
|
The AWK Programming Language,
|
|
Addison-Wesley, 1988. ISBN 0-201-07981-X
|
|
.SH バグ
|
|
数値と文字との間の明示的な変換はありません。
|
|
式を強制的に数値として扱わせるには、0 を足してください。
|
|
式を強制的に文字として扱わせるには、
|
|
\&\f(CW""\fP
|
|
を結合してください。
|
|
.br
|
|
関数における変数のスコープ規則は不細工です。文法はさらにひどいです。
|