如何正确对齐 sed 捕获组的输出

How to align properly the output of sed capture grous

我用日志解析了一些文件,并使用 sed 中的捕获组获取特定值。它可以工作,但是当我有一些大值时对齐不正确

这是一个日志示例:

== 2022-02-01 18:30:36.301 +0100 == Packet received at ingress stage, tag 0, type ORDERED Packet info: len 131 port 18 interface 18 vsys 1 wqe index 31527 packet 0x0xc0046e99c0, HA: 0, IC: 0 Packet decoded dump: L2: 00:50:56:b8:17:29->00:50:56:b8:6f:d7, type 0x0800 IP: 172.16.10.20->172.16.0.10, protocol 6 version 4, ihl 5, tos 0x00, len 117, id 27949, frag_off 0x4000, ttl 128, checksum 5931(0x2b17) TCP: sport 21, dport 62040, seq 3281740227, ack 4101579101, reserved 0, offset 5, window 256, checksum 21106, flags 0x18 ( ACK PSH), urgent data 0, l4 data len 77 TCP option:

这是我的命令的输出:

sed -E 's/.*at ([a-z]+) stage.*tag ([0-9]+).*type ([A-Z]+) .*IP: ([0-9\.]+)->([0-9\.]+).*sport ([0-9]+).*dport ([0-9]+).*\( ([A-Z\ ]+)\).*data len ([0-9]+).*/ \t       \t   \t ->   \t\t \t->     \t      \t/' one_liners2
slowpath        2900202469              ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           SYN             0
fastpath        1068            ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           SYN             0
ingress         0               ORDERED         172.16.10.20 -> 172.16.0.10             21      -> 62040        SYN ACK         0
fastpath        1068            ATOMIC          172.16.10.20 -> 172.16.0.10             21      -> 62040        SYN ACK         0
ingress         0               ORDERED         172.16.0.10 -> 172.16.10.20             62040   -> 21           ACK             0
fastpath        1068            ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           ACK             0
ingress         0               ORDERED         172.16.10.20 -> 172.16.0.10             21      -> 62040        ACK PSH         77

正如您在上面看到的,第一行的对齐方式不好。我尝试使用 \t 和空格,但与其他行相比,第一行显示的对齐方式仍然不正确。有什么方法可以让 sed 整齐地对齐它们?

期望的输出:

slowpath        2900202469      ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           SYN             0
fastpath        1068            ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           SYN             0
ingress         0               ORDERED         172.16.10.20 -> 172.16.0.10             21      -> 62040        SYN ACK         0
fastpath        1068            ATOMIC          172.16.10.20 -> 172.16.0.10             21      -> 62040        SYN ACK         0
ingress         0               ORDERED         172.16.0.10 -> 172.16.10.20             62040   -> 21           ACK             0
fastpath        1068            ATOMIC          172.16.0.10 -> 172.16.10.20             62040   -> 21           ACK             0
ingress         0               ORDERED         172.16.10.20 -> 172.16.0.10             21      -> 62040        ACK PSH         77

是否有其他方法可以使用 awk 完成上述操作?

非常感谢任何帮助!

建议 awk 脚本:

 awk '{split([=10=],strArr,"\( |\), ");printf "%-10s %-12s %-9s %+16s -> %-16s %+6s -> %-6s %-8s %s\n",,,,,,,,strArr[2],$(NF-2)}' FS="( |, |: |->)" input.1.txt

提供的输入的输出:

 ingress    0            ORDERED       172.16.10.20 -> 172.16.0.10          21 -> 62040  ACK PSH  77