如何拆分字符串并摆脱它们之间的字符

时间:2014-06-09 14:22:22

标签: bash shell

这是我的最终数据:

  

aodv-node-0-0.pcap_udp_filtered.pcap_MAC_sort.txt 9.051614   DA:00:00:00:00:00:03 SA:00:00:00:00:00:01 10.0.0.1.49154   10.0.0.9.50003:UDP,长度512

我希望得到如下输出:

  

node-0 9.051614 00:00:00:00:00:03 00:00:00:00:00:01 10.0.0.1 49154   10.0.0.9 50003 UDP 512

我已经读过将一个字符串拆分为两个变量,但实际上我以后不需要将它们用作变量,所以可能有任何方法只是剪切字符串的某些部分,以防万一: 10.0.0.1.49154 只是将它分成两个字符串并摆脱中间的点。 (我需要不同列中的IP和端口号。)

感谢任何提示

2 个答案:

答案 0 :(得分:1)

这个Gawk脚本

gawk -F ' ' '0; END { print gensub(/[.].*$/, "", "g", $1),
    $2,
    gensub(/^DA:/, "", "g", $3),
    gensub(/^SA:/, "", "g", $4),
    gensub(/[.][^.]*$/, "", "g", $5),
    gensub(/^.*[.]/, "", "g", $5),
    gensub(/[.][^.]*$/, "", "g", $6),
    gensub(/:/, "", "g", gensub(/^.*[.]/, "", "g", $6)),
    gensub(/,$/, "", "g", $7),
    $9 }' file

将处理文件的最后一行并生成类似

的输出
aodv-node-0-0 9.051614 00:00:00:00:00:03 00:00:00:00:00:01 10.0.0.1 49154 10.0.0.9 50003 UDP 512

它可以与更简单的Awks更兼容但你得到了这个概念。当然,每个人都会发现很容易依据。

这个版本只有一个node-0,但我不确定它是否是你想要它完成的正确方式:

gawk -F ' ' '0; END { sub(/[.].*$/, "", $1); sub(/aodv-/, "", $1); sub(/-[0-9]$/, "", $1);
    print $1,
        $2,
        gensub(/^DA:/, "", "g", $3),
        gensub(/^SA:/, "", "g", $4),
        gensub(/[.][^.]*$/, "", "g", $5),
        gensub(/^.*[.]/, "", "g", $5),
        gensub(/[.][^.]*$/, "", "g", $6),
        gensub(/:/, "", "g", gensub(/^.*[.]/, "", "g", $6)),
        gensub(/,$/, "", "g", $7),
        $9 }' file

答案 1 :(得分:1)

如果你的输入是这样的一行,

aodv-node-0-0.pcap_udp_filtered.pcap_MAC_sort.txt 9.051614 DA:00:00:00:00:00:03 SA:00:00:00:00:00:01 10.0.0.1.49154 10.0.0.9.50003: UDP, length 512

然后你可以运行下面的GNU sed命令来获得所需的输出,

sed -r 's/^[^-]*-([^-]*?-.)[^ ]* ([0-9\.]+) DA:([^ ]*) SA:([^ ]*) ([0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3})\.([0-9]+) ([0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3})\.([0-9]+):(.*)$/\1 \2 \3 \4 \5 \6 \7 \8\9/g' file | sed -r 's/^([^,]*),.* ([0-9]+)$/\1 \2/g'

示例:

$ echo 'aodv-node-0-0.pcap_udp_filtered.pcap_MAC_sort.txt 9.051614 DA:00:00:00:00:00:03 SA:00:00:00:00:00:01 10.0.0.1.49154 10.0.0.9.50003: UDP, length 512' | sed -r 's/^[^-]*-([^-]*?-.)[^ ]* ([0-9\.]+) DA:([^ ]*) SA:([^ ]*) ([0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3})\.([0-9]+) ([0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3})\.([0-9]+):(.*)$/\1 \2 \3 \4 \5 \6 \7 \8\9/g' | sed -r 's/^([^,]*),.* ([0-9]+)$/\1 \2/g'
node-0 9.051614 00:00:00:00:00:03 00:00:00:00:00:01 10.0.0.1 49154 10.0.0.9 50003 UDP 512