在不同情况下使用正则表达式

时间:2013-02-04 15:51:55

标签: bash sed awk

我有一个简单的任务:

从这样的输出:

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp
Destination            Cookies                           Created
89.208.102.86.500      d0a641ed0aa7bfe9:7ae3428b08fab146 2013-02-04 15:32:18

只需要获取IP地址字符串和日期字符串(在不同的请求中)。

对于IP,我写了以下正则表达式:

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/p'
89.208.102.86

但是对于日期不起作用

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\}\  \([0-9]\{2\}:\)\{2\}[0-9]\{2\}\)$/\2/p'
[root@localhost:~]# 

无法理解错误在哪里?

另外我想使用flag -r更改/(表达式/)和/ {expression /},但不知道怎么做

提前谢谢

P.S。 我也知道替代变体:

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp |awk -F\. '/[0-9]/ {print $1"."$2"."$3"."$4}' 
89.208.102.86

[root@localhost:~]# racoonctl -s /var/racoon/racoon.sock ss isakmp | awk '/[0-9]/ {print $3 " " $4}'
2013-02-04 15:32:18

但是我想在sed上做这件事,因为我未来的任务很艰巨。

4 个答案:

答案 0 :(得分:1)

您可以使用以下sed:

sed -ne 's/^.*\([0-9]\{4\}\(\-[0-9]\{2\}\)\{2\} \)/\1/p'

得到你的约会。

答案 1 :(得分:1)

怎么样:

# IP 
$ sed -rn '2s/\.[0-9]+ .*//p' file
89.208.102.86

# Date and time
$ sed -rn '2s/(\S+\s+){2}//p' file
2013-02-04 15:32:18

# Just date
$ sed -rn '2s/(\S+\s+){2}(\S+).*/\2/p' file
2013-02-04

答案 2 :(得分:1)

对于像1.2.3.4这样的IP,它是:

sed -n 's%\([0-9.]+\).*%\1%p'
sed -rn 's%([0-9.]+).*%\1%p'

并且约会是:

sed -n 's%.*\ \([0-9-]\+\ [0-9:]\+\)%\1%p'
sed -rn 's%.* ([0-9-]+ [0-9:]+)%\1%p'

如果IP总是像1.2.3.4.5(因此,第五个字段显然是端口号),则sed命令为:

sed -n 's%\([0-9.]\+\)\.[0-9]\+.*%\1%p'
sed -rn 's%([0-9.]+)\.[0-9]+.*%\1%p'

答案 3 :(得分:1)

假设cookie中没有空格,一个简单的while read循环就可以了:

racoonctl ... | while read -r ip cookies date; do
    # do something with "ip" and "date"
    echo $ip
    echo "$date"
done

如果你想扔掉标题行

racoonctl ... | {
    read header
    while read -r ip cookies date; do
        # do something with "ip" and "date"
        echo $ip
        echo "$date"
    done
}