使用其他命令修改 awk 参数

ygo*_*goe 1 awk

我有一个这样的文件,其中包含行中的多个字段。我想显示其中一些,同时用另一个命令处理其中一个。

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,我之前已经这样做了,所以这不是问题的一部分。

anu*_*ava 5

你可以使用这个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_LIST
  • cmd = "date +\047%Y-%m-%d %H:%M:%S\047 -d\047@" $9 "\047": 格式化date命令使用$9
  • cmd | getline dt调用外部date命令
  • (cmd | getline dt) > 0:date命令成功时
  • print: 打印date字段的第 2、4 和输出