3

ターゲット ファイルに対してこの grep を実行すると、たとえば 275 という結果が得られます。

しかし、私はawkを学びたいので、awkでこれを試しました:

 awk 'BEGIN { count=0 } /my pattern/ { count++ } END { print count }' myfile.log

そして、これは期待どおりに 275 を出力します。

野心的になったので、次のような awk スクリプトを作成しました。

BEGIN { 
   print "Log File Analysis";
   message=0;
   events=0;
}

{
  /message/  {  messages++;  }
  /event/    { events++;  }
}
END { 
  print "messages:\t" messages;
  print "events:\t" events;
}

構文エラーが発生します。

$ awk -f test_learn.awk test_log.log
awk: test_learn.awk:16:   /message/  {  messages++;  }
awk: test_learn.awk:16:              ^ syntax error

私は何を間違っていますか?

Windows 7 で MinGW シェルの awk を使用しています。

4

1 に答える 1

1

試す

 awk 'BEGIN { count=0 }; /my pattern/{count++ }; END { print count }' myfile.log

また

awk 'BEGIN { count=0};  { if ($0 ~ /my pattern/)  count++ }; END { print count };' myfile.log

さらに良いことに、変数はデフォルトでゼロとして初期化されるため、BEGIN ブロックは必要ありません。

awk '/my pattern/{count++ }; END { print count };' myfile.log

if を使用した 2d の例のように、ファイル内のすべての行にデフォルトのループを適用するか、上記のようにパターンで「フィルター処理」された複数のブロックを追加して編集することができます。

ワンライナーを実行する場合、一部の awks では、メイン ループ ブロックから BEGIN ブロックと END ブロックを区切るためにセミコロンが必要でした。

編集

あなたの第2号と同じアイデアで、Ed Mortonの改善を統合しています(ありがとう)

/message/  {  messages++  }
/event/    { events++  }

END { 
 print "Log File Analysis"
 print "messages:\t" messages
  print "events:\t" events
}

IHTH

于 2012-11-15T11:04:24.243 に答える