Sed

如何修復csv字元串格式

  • January 14, 2021

我有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/…

根據您展示的範例,快速破解將是

  • 不更換,(...)
  • 但要替換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 ...部分只是為了模擬您的命令輸出。

如果沒有嵌套括號,因為您沒有這麼說,那麼使用sed

sed ':repeat s/\(([^,)]*\),\([^)]*)\)/\1;\2/;t repeat' infile

引用自:https://unix.stackexchange.com/questions/629122