如何从 awk 一起打印多个输出行

如何从 awk 一起打印多个输出行

我的输出看起来像

________________________________________________

 :: Method           : GET
 :: URL              : HOST/FUZZ
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 500
 :: Matcher          : Response status: 200
________________________________________________

[Status: 200, Size: 52, Words: 2, Lines: 6]
    * FUZZ: index.jsp
    * HOST: https://test.com


我想从这个输出中得到的只是将它们联系在一起的两件事

预期产出

https://test.com/index.jsp

我已经尝试过的是

awk '/HOST:/{ print $4} /FUZZ:/{ print $4}' ffuf'

输出

index.jsp
https://test.com

十六进制转储输出

grep 'FUZZ:' ffuf | hexdump -C

输出

00000000  0d 0d 20 20 20 20 2a 20  46 55 5a 5a 3a 20 69 6e  |..    * FUZZ: in|
00000010  64 65 78 2e 6a 73 70 0a                           |dex.jsp.|
00000018

知道如何联系他们吗?

谢谢

答案1

hexdump您显示的输出中可以清楚地看出,包含您要查找的数据的行的开头有两个回车符。如果您使用 解析数据,这些将构成这些行上的第一个字段awk。下面的两种变体 (sed和) 都通过忽略 ( ) 或避免 ( ) 这些awk来解决此问题。sedawk


使用sed, 并假设 with 行FUZZ:始终出现在 with 行之前HOST:

$ sed -n '/.*FUZZ: /{ s///; h; }; /.*HOST: /{ s///; G; s,\n,/,p; }' file
https://test.com/index.jsp

sed命令(在使用 关闭每行的默认输出的情况下运行-n)匹配该FUZZ:行并删除该行上直到文件名的所有内容。然后将文件名复制到保留空间h

当该HOST:行匹配时,同样会删除该行的开头,并将保留空间的内容附加到 URL(该HOST:行的其余部分)。然后,命令插入的换行符G将更改为斜杠,并打印结果字符串。


使用awk, 与上面相同的假设:

$ awk -v OFS='/' '/FUZZ:/ { fuzz = $NF } /HOST:/ { print $NF, fuzz }' file
https://test.com/index.jsp

在这里,变量fuzz扮演了我们在上面的变体中使用的保存空间的角色sed,即保存文件名。$NF是一行中最后一个字段的数据。

答案2

我通过这样做实现了这一点

awk '/FUZZ:/{ FUZZ=$4; next } /HOST:/{ print $4 "/" FUZZ }'

输出

https://test.com/index.jsp

相关内容