我有输出线ipsec statusall <conn_name>
。取决于交通流量,它可能是:
sr_mesh_aws_22{10}: AES_CBC_256/HMAC_SHA2_256_128/MODP_1024, 0 bytes_i, 0 bytes_o, rekeying in 32 minutes
有时:
sp_mesh_6_7{8}: AES_CBC_256/HMAC_SHA2_256_128, 336 bytes_i, 336 bytes_o (4 pkts, 15s ago), rekeying disabled
或者:
sr_mesh_aws_21{24}: AES_CBC_256/HMAC_SHA1_96, 59189 bytes_i (469 pkts, 0s ago), 128238 bytes_o (431 pkts, 0s ago), rekeying in 32 minutes
字符串格式:
conn_name{id}: algorithm, traffic in info, traffic out info, rekeying info
一切都很容易解析,但是当流量开始流动时,额外的信息会出现在traffic in info
或traffic out info
之间的字段中(...)
。而且有 2 个字段被相同的分隔,
!
如果存在的话如何将所有替换,
为;
所有内部?(...)
更好的简单 shell 工具:sed/awk/...
答案1
根据您展示的示例,一个快速破解方法是
- 不替换
,
内(...)
- 但要替换
pkts,
为pkts;
给予:
echo "sr_mesh_aws_21{24}: AES_CBC_256/HMAC_SHA1_96, 59189 bytes_i (469 pkts, 0s ago), 128238 bytes_o (431 pkts, 0s ago), rekeying in 32 minutes" | sed 's/pkts,/pkts;/g'
注意:该echo ...
部分只是模拟您的命令输出。
答案2
如果没有嵌套括号,就像您没有说的那样,那么sed
:
sed ':repeat s/\(([^,)]*\),\([^)]*)\)/\1;\2/;t repeat' infile