一段时间以来一直在尝试解决这个问题。浏览了这个网站并疯狂地用谷歌搜索。如果有人可以提供帮助,我们将不胜感激。
我有一些没有标题的日志文件,并且列到处都是。这意味着像 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