AWK 比赛按学期进行。列未对齐

AWK 比赛按学期进行。列未对齐

一段时间以来一直在尝试解决这个问题。浏览了这个网站并疯狂地用谷歌搜索。如果有人可以提供帮助,我们将不胜感激。

我有一些没有标题的日志文件,并且列到处都是。这意味着像 src=4.2.2.2 这样的项目可以位于文件中的任何位置。文件中的所有对象都具有 Something=xxx 格式。

日志示例:

src=1.1.1.1 sport=12312 dport=80 message=hacked

dport=443 src=2.2.2.2 消息=null sport=32432

消息=干净 dport=21 运动=43434 src=3.3.3.3

我已经使用了 match() 函数,但我正在尝试提取多个字段。

gawk 'match($0, "src=([^ ]+)") { print substr($0, RSTART, RLENGTH) } ' 文件

给了我以下内容:

源=1.1.1.1

源=2.2.2.2

源=3.3.3.3

我想要多个字段,如 src、dport 和 message,以便输出排列起来,如下所示:

src=1.1.1.1 dport=80 消息=黑客攻击

src=2.2.2.2 dport=443 消息=null

src=3.3.3.3 dport=21 消息=干净

这可以用 gawk 或其他东西吗?

谢谢!

答案1

使用 GNU awk(注意:这依赖于“key”字符串的词法排序顺序):

gawk '{split($0,a); asort(a); printf("%s\t%s\t%s\n", a[4], a[1], a[2])}' file
src=1.1.1.1     dport=80        message=hacked
src=2.2.2.2     dport=443       message=null
src=3.3.3.3     dport=21        message=clean

答案2

Awk解决方案(与项目位置无关):

awk 'function get_item(name){ 
         match($0, name"=[^[:space:]]+"); 
         return substr($0, RSTART, RLENGTH) 
     }
     { print get_item("src"), get_item("dport"), get_item("message") }' file

通过上述方法,您可以按任何顺序输出关键的所需项目。

输出:

src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean

相关内容