awkのマニュアルによると、BEGINとENDは入力の照合には使用されず、起動とクリーンアップを提供するために使用されます。 -awkスクリプトへの情報のアップ。次に示す例を示します。
ls -l | \ awk "BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }" Files found: amd.conf antivir.conf xcdroast.conf xinetd.conf
最初に、出力する文字列を出力します。次に、入力のパターン一致をチェックします。入力は、aまたはxで始まり、その後に任意の文字が1回または複数回続き、その後に.confが続きます。一致する場合は、9番目の列が出力されます。
ここからbeginを使用する必要があるということは、awkがBEGINまたはENDを含む最大1つのprint関数しか使用できないということですか?そうでない場合は、なぜ「BEGIN」というキーワードなしで最初に印刷機能を使用できないのですか?BEGINは不要なようです。
コメント
- BEGINを使用せずにコマンドを実行するだけで質問に答え、'は不要ではなく、異なる結果が得られることを示します。
回答
BEGIN
は不要ではありません。 BEGIN
を指定しない場合、print
が入力のすべての行に対して実行されます。
からの引用マニュアル:
A
BEGIN
ルールは、最初の入力レコードが読み取られる前に1回だけ実行されます。同様に、END
ルールは、すべての入力が読み取られた後、1回だけ実行されます。
$ seq 5 | awk "BEGIN{print "Hello"}/4/{print}" # Hello printed once Hello 4 $ seq 5 | awk "{print "Hello"}/4/{print}" # Hello printed for each line of input Hello Hello Hello Hello 4 Hello $
回答
awk
は各行のおよびEND
ブロック。BEGIN
およびEND
の場合ブロック、awk
は、入力の処理が開始される前、および入力の処理が実行された後、ステートメントを1回だけ処理します。効果的に。 BEGIN
ブロックがないと、ヘッダーなどの1回限りの情報を出力できないだけでなく、本体に必要な変数の一部を効率的に初期化できません。また、参考までに、awk
プログラムには複数のBEGIN
ブロックとEND
ブロックを含めることができます。
回答
awk
は、前のパターンが一致する場合にのみすべてのブロックを実行します。空のパターン(ブロックのみ)はすべての行に一致します。 BEGIN
とEND
は、ファイルの最初と最後に一致する特別なパターンです(^
および$
水平方向)。
ファイルを読み取る前に何かを実行する場合は、BEGIN
。たとえば、カウンタなどの初期化。 END
は結果を収集できます。
回答
与えられた例では、教育学的な明確さのために簡略化されていると思いますが、それは不必要です。 BEGIN
を使用しなくても同じ結果を得ることができます。
1 == NR { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }
printステートメントは次のようになっているため、同じ結果が得られます。入力の最初の行だけに制限されます。
そうは言っても、BEGIN
ブロックとEND
ブロックは非常に強力です。ツール。他のソリューションで述べたように、BEGIN
ブロックを使用して、変数または1回だけ実行する必要がある他のルーチンを初期化できますが、ない場合はAwkコマンドを実行するためにも使用できます。処理するファイル。簡単な例:
BEGIN { print sqrt(12/4) }
入力を処理せずにAwkでプログラミングするより深刻な例を見ることができますここ。
同様に、END
ブロックは、計算を実行し、すべての入力を要約するのに非常に役立ちます。これは(通常)最初にすべてのデータを読み込まない限り実行できません。入力の要約の簡単な例はここにあります