使用sed或awk更改某些地方的单词

时间:2016-10-29 21:57:03

标签: bash awk sed

我有一个格式(输入):

95.56.00.000 root pass|220 smtp1.auchan.hu

我想获得(输出):

root@auchan.hu,root,pass,95.56.00.000:465

IP可以是任何东西,也可以是域名(包括子域名),但我们公司的登录名和密码是相同的。另外,如您所见,我将在输出结果中添加一个端口465。

我试着用sed和awk做这件事。

5 个答案:

答案 0 :(得分:1)

$ awk -F'[ |]' -v OFS=',' '{sub(/[^.]+./,"",$5); print $2"@"$5, $2, $3, $1":465"}' <<<'95.56.00.000 root pass|220 smtp1.auchan.hu'
root@auchan.hu,root,pass,95.56.00.000:465

答案 1 :(得分:0)

你可以写:

awk -F'[ |]|smtp[0-9]*\\.' '{printf "%s@%s,%s,%s,%s:465\n",$2,$NF,$2,$3,$1}'

答案 2 :(得分:0)

awk '{ split($4, d, "."); 
       split($3, p, "|"); 
       print $2 "@" d[2] "." d[3] "," $2 "," p[1] "," $1 ":465" }' 

答案 3 :(得分:0)

使用sed:

$ sed -E 's/^([^ ]*) ([^ ]*) ([^|]*)[^ ]* [^.]*\.(.*)/\2@\4,\2,\3,\1:465/' <<< '95.56.00.000 root pass|220 smtp1.auchan.hu'
root@auchan.hu,root,pass,95.56.00.000:465

这使用带有四个捕获组的单个替换命令,假设输入中的单词之间有空格:

^([^ ]*) # 1 (captured): non-spaces anchored at start of line
([^ ]*)  # 2 (captured): next group of non-spaces
([^|]*)  # 3 (captured): group of non-pipes
[^ ]*    # a (not captured): group of non-spaces
[^.]*\.  # b (not captured): non-periods followed by one period
(.*)     # 4 (captured): rest of line

所以输入行按如下方式分成这些组:

95.56.00.000 root pass|220 smtp1.auchan.hu
<----1-----> <2-> <3-><a-> <-b--><---6--->

然后在替换命令的第二部分重新排列,添加@,逗号和端口。

答案 4 :(得分:0)

使用sed命令删除不必要的项目,然后部署awk根据您喜欢的顺序打印值。

echo "95.56.00.000 root pass|220 smtp1.auchan.hu" | sed 's/smtp1.//g' | sed 's/|/\ /g' | awk '{print $2"@"$5","$2","$3","$1":456"}'