如何处理 awk 行匹配?

如何处理 awk 行匹配?

我有一个文件,其中包含我想要提取的一些数据行。我认为awk很适合这个。在伪代码中,我想象做类似的事情:

  1. 找到我想要处理的行的匹配项awk
  2. 在第二部分中,在内部{}找到与我的数据匹配的正则表达式,也许与grep -o?
  3. {}打印匹配项,可能在 the或 inside 的末尾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任意数量的规则-操作对。由于您似乎想要对某些子字段重新排序,因此您可能需要一个全局规则,将 后面的所有内容拆分为:一个数组,您可以稍后在每个规则的基础上进行操作。

例如(我在这里只显示了前两个):

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

答案2

我也不确定我明白你需要什么,但我想我会一次性做到这一点,沿着这个思路......

awk '/Time|Requests|Transfer/{print $0}' data.txt

通过这种方式,您可以加载模式来匹配并使用“|”。因此/Time|Requests|Transfer/意味着“匹配时间或请求或转移”并打印出该行

答案3

使用TXR

@(repeat)
@  (cases)
@param: @val [@units] (@rawdesc)
@  (or)
@param: @val [@units] @rawdesc
@  (or)
@param: @val [@units]
@    (bind rawdesc nil)
@  (or)
@param: @val @units (@rawdesc)
@  (or)
@param: @val @units @rawdesc
@  (or)
@param: @val @units
@    (bind rawdesc nil)
@  (or)
@param: @val
@    (bind units "")
@    (bind rawdesc nil)
@  (end)
@  (bind desc @(if rawdesc ` (@(regsub #/,/ "" rawdesc))` ""))
@  (output)
@param@desc, @val, @units
@  (end)
@(end)

跑步:

$ txr tocsv.txr 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 (mean), 257.40, #/sec
Time per request (mean), 3.885, ms
Time per request (mean across all concurrent requests), 3.885, ms
Transfer rate (received), 210.65, Kbytes/sec

尽管由于案例的“阶梯”,它看起来很冗长,但这些很容易通过复制和粘贴来完成。该代码在第一次尝试时就产生了所需的结果,并且易于理解:一眼就能看出它正在寻找什么。

案例的顺序很重要。如果情况以比赛开始

@param: @val

放在第一位,val会消耗冒号和空格之后的整个值。

相关内容