如何合并这些代码,awk然后剪切

时间:2016-09-14 00:30:22

标签: awk cut

我在Debian中使用awk。

输入

11.22.33.44#55878:
11.22.33.43#55879:
...
...
(smtp:55.66.77.88)
(smtp:55.66.77.89)
...
...
cpe-33-22-11-99.buffalo.res.rr.com[99.11.22.33]
cpe-34-22-11-99.buffalo.res.rr.com[99.11.22.34]
...

部分sh代码(在Debian中运行)

awk '/#/ {print > "file1";next} \
/smtp/ {print > "file2";next} \
{print > "file7"}' input
#
if [ -s file1 ] ; then
    #IP type => 11.22.33.44#55878:
    cut -d'#' -f1 file1 >> output
    rm -f file1
fi
#
if [ -s file2 ] ; then
    #IP type => (smtp:55.66.77.88)
    cut -d':' -f2 file2 | cut -d')' -f1 >> output
    rm -f file2
fi
#
if [ -s file7 ] ; then
    #IP type => cpe-33-22-11-99.buffalo.res.rr.com[99.11.22.33]
    cut -d'[' -f2 file7 | cut -d']' -f1 >> output
    rm -f file7
fi

然后输出

11.22.33.44
11.22.33.43
55.66.77.88
55.66.77.89
99.11.22.33
99.11.22.34

是否可以仅使用awk合并这些代码,例如

awk '/#/ {print | cut -d'#' -f1 > "file1";next} \
/smtp/ {print | cut -d':' -f2 | cut -d')' -f1 > "file2";next} \
{print | cut -d'[' -f2 file7 | cut -d']' > "file7"}' input

我是新手,不知道这个, 搜索问题后,仍无济于事。 任何提示? 感谢。

最好的问候。

1 个答案:

答案 0 :(得分:1)

$ awk -F'[][()#]|smtp:' '/#/{print $1;next} /smtp/{print $3;next} /\[/{print $2}' input
11.22.33.44
11.22.33.43
55.66.77.88
55.66.77.89
99.11.22.33
99.11.22.34

要将其保存在文件output中:

awk -F'[][()#]|smtp:' '/#/{print $1;next} /smtp/{print $3;next} /\[/{print $2}' input >output

如何运作

  • -F'[][()#]|smtp:'

    这会将字段分隔符设置为(a)任何字符][()#或(b)字符串smtp:

  • /#/{print $1;next}

    如果该行包含#,则打印第一个字段并跳至next行。

  • /smtp/{print $3;next}

    如果该行包含smtp,则打印第三个字段并跳至next行。

  • /\[/{print $2}

    如果该行包含[,则打印第二个字段。

变异

解决此问题的方法不止一种,例如,使用稍微不同的字段分隔符,我们仍然可以获得所需的输出:

$ awk -F'[][()#:]' '/#/{print $1;next} /smtp/{print $3;next} /\[/{print $2}' input
11.22.33.44
11.22.33.43
55.66.77.88
55.66.77.89
99.11.22.33
99.11.22.34