我有一个这样的文件,其中包含行中的多个字段。我想显示其中一些,同时用另一个命令处理其中一个。
TITLE,OpenVPN ...
HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Virtual IPv6 Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t),Username,Client ID,Peer ID
CLIENT_LIST,name1,1.1.1.1:1,10.0.0.1,,2692253,3765861,Wed Jun 23 12:51:08 2021,1624452668,name1,4727,0
CLIENT_LIST,name2,2.2.2.2:2,10.0.0.2,,1571221,2080242,Thu Jul 1 19:24:10 2021,1625167450,name2,5625,0
CLIENT_LIST,name3,3.3.3.3:3,10.0.0.3,,2670410,3736957,Wed Jun 23 16:20:51 2021,1624465251,name3,4747,0
...
Run Code Online (Sandbox Code Playgroud)
预期的输出是这样的:
name1 10.0.0.1 2021-06-23 12:51:08
name2 10.0.0.2 2021-07-01 19:24:10
name3 10.0.0.3 2021-06-23 16:20:51
Run Code Online (Sandbox Code Playgroud)
我现在的命令是这样的:
grep '^CLIENT_LIST,' /var/run/ovpn-server.status |awk -F',' '{print $2 $4 $9}' |sort
Run Code Online (Sandbox Code Playgroud)
它打印所需的字段,但不会将时间戳转换为格式化的时间。这是命令:
date -d @1624452668 +"%Y-%m-%d %H:%M:%S"
Run Code Online (Sandbox Code Playgroud)
如何将date命令集成到awk脚本中?或者还有什么其他解决方案可以实现这一目标?
我还打算使用命令将输出放入列/表布局中column,我之前已经这样做了,所以这不是问题的一部分。
你可以使用这个awk:
awk -F, -v OFS='\t' '$1 == "CLIENT_LIST" {
cmd = "date +\047%Y-%m-%d %H:%M:%S\047 -d\047@" $9 "\047"
print $2, $4, ((cmd | getline dt) > 0 ? dt : $9)
close(dt)
}' file
name1 10.0.0.1 2021-06-23 08:51:08
name2 10.0.0.2 2021-07-01 15:24:10
name3 10.0.0.3 2021-06-23 12:20:51
Run Code Online (Sandbox Code Playgroud)
解释:
-F, -v OFS='\t': 将输入字段分隔符设置为,和输出字段分隔符设置为制表符'$1 == "CLIENT_LIST": 当第一个字段是 CLIENT_LISTcmd = "date +\047%Y-%m-%d %H:%M:%S\047 -d\047@" $9 "\047": 格式化date命令使用$9cmd | getline dt调用外部date命令(cmd | getline dt) > 0:date命令成功时print: 打印date字段的第 2、4 和输出