awkコマンドを使用したBEGINとEND

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は、前のパターンが一致する場合にのみすべてのブロックを実行します。空のパターン(ブロックのみ)はすべての行に一致します。 BEGINENDは、ファイルの最初と最後に一致する特別なパターンです(^および$水平方向)。

ファイルを読み取る前に何かを実行する場合は、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ブロックは、計算を実行し、すべての入力を要約するのに非常に役立ちます。これは(通常)最初にすべてのデータを読み込まない限り実行できません。入力の要約の簡単な例はここにあります

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です