我需要管理公司中的 smtp 日志文件处理。
这些日志文件需要导入到 MSSQL,因此我的工作就是提供这些数据。
我收到奇怪的未送达消息,其中带有“;” 在字符串中,我需要用逗号替换它。
所以我得到的是:
Sender;Recipient;Operation;Answer;Error;Servername
bla@bla.com;rockit@sohard.com;RCPT TO;450;+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions;+try+later;M0641
Run Code Online (Sandbox Code Playgroud)
提及“;” 在“限制”后面的答案字段中,不知道为什么邮件服务器发送分号,也许是为了惹恼我:P
经过大量研究后,我尝试使用 awk 进行以下操作:
awk 'BEGIN{FS=OFS=";"} {for (i=5;i<=NF;i++) gsub (";",",",$i)} 1' myfile.csv
Run Code Online (Sandbox Code Playgroud)
这个命令实际上有效,但似乎它对我的文件“;”没有任何作用。在错误字段中仍然存在。我在这里缺少什么?
;为,$ awk -F\; '{for (i=1;i<=NF;i++) printf "%s%s",$i,(i==NF?ORS:(i<=4?";":","))}' myfile.csv
Sender;Recipient;Operation;Answer;Error,Servername
bla@bla.com;rockit@sohard.com;RCPT TO;450;+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
-F\;
这将输入的字段分隔符设置为;。
for (i=1;i<=NF;i++) printf "%s%s",$i,(i==NF?ORS:(i<=4?";":","))
此循环遍历每个字段并打印该字段,如果我们位于最后一个字段,则打印该字段,后跟 (a) ORS,或者 (b),如果我们位于第 5 个或更高字段,或者 (c);如果我们位于前四个字段之一。
;为,尝试:
$ awk -F\; '{$1=$1} 1' OFS=, myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
-F\;
这将输入上的字段分隔符设置为分号。
$1=$1
这会导致 awk 认为该行已更改,因此 awk 将更新输出行以使用新的字段分隔符。
1
这告诉 awk 打印该行。
OFS=,
这将输出上的字段分隔符设置为逗号。
$ awk '{gsub(/;/, ",")} 1' myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)
$ sed 's/;/,/g' myfile.csv
Sender,Recipient,Operation,Answer,Error,Servername
bla@bla.com,rockit@sohard.com,RCPT TO,450,+4.2.0+<rockit@sohard.com>:+Recipient+address+rejected:+Policy+restrictions,+try+later,M0641
Run Code Online (Sandbox Code Playgroud)