awkラインマッチングを処理する方法は?

awkラインマッチングを処理する方法は?

抽出したいデータ行を含むファイルがあります。私はawkこれが完璧だと思います。疑似コードでは、次のようなことを想像しています。

  1. 処理したい行に一致する項目を探すawk
  2. 2番目の部分では、内部的に{}私のデータと一致する正規表現を探しますgrep -o
  3. {}おそらく、端または内側に一致するものを印刷します。END

これをどうすればいいかわからず、cut正しく使用していないこともわかりますが、ただ意図をちょっと与えるためにお見せするだけです。助けてください。本質的に、私はさまざまな正規表現の一致を特定し$0て抽出し、それを独自のCSV形式に統合できるようにしたいと思います。

私が試したことは次のとおりです。

➜  tmp cat data.txt
Concurrency Level:      1
Time taken for tests:   0.004 seconds
Complete requests:      1
Failed requests:        0
Total transferred:      838 bytes
HTML transferred:       632 bytes
Requests per second:    257.40 [#/sec] (mean)
Time per request:       3.885 [ms] (mean)
Time per request:       3.885 [ms] (mean, across all concurrent requests)
Transfer rate:          210.65 [Kbytes/sec] received
➜  tmp cat data.txt | awk '/Complete requests:/ {print;}'
Complete requests:      1
➜  tmp cat data.txt | awk '/Complete requests:/ {print $0;}'
Complete requests:      1
➜  tmp cat data.txt | awk '/Complete requests:/ {print;}'|cut -d: -f2
      1

似たようなものを見つけなければなりません。

Time taken for tests, 0.0004, s 
Requests per second (mean), 257.40, #/sec
.
.
.
Transfer rate received, 210.65, Kbytes/sec

データは非常に均一ではないため、各一致$0に対して別々の「正規表現一致後」プロセスを作成する必要があります/Concurrency Level:/Time taken for tests:

ベストアンサー1

awkルール - アクションペアは任意の数だけ持つことができます。特定のサブフィールドの順序を変更したいと思うので、:後でルールごとに実行できる配列に従うすべての項目を分割するグローバルルールが必要になる場合があります。

たとえば、(ここでは最初の2つだけを表示しました):

awk '
BEGIN {FS=":[ \t]+"; OFS=", "}
{split($2, a, /[ \t]+/)}
#
# now the case-by-case rule-action pairs
/Time taken/ {print $1, a[1], a[2]}
/Requests per second/ {print $1" "a[3], a[1], substr(a[2], 2, length(a[2])-2)}
' data.txt
Time taken for tests, 0.004, seconds
Requests per second (mean), 257.40, #/sec

おすすめ記事