1

我有一个简单的任务:

从这样的输出:

[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:~]# 

无法理解错误在哪里?

我也想使用标志 -r 更改 /(expression/) 和 /{expression/},但不知道该怎么做

先感谢您

PS我也知道替代变体:

[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

4 回答 4

1

您可以使用以下 sed:

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

得到你的约会。

于 2013-02-04T16:00:57.337 回答
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
于 2013-02-04T16:03:35.040 回答
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'
于 2013-02-04T16:07:54.010 回答
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
}
于 2013-02-04T17:49:38.640 回答