2

我有以下输出:

    [root@localhost:~]# setkey -DP
    (per-socket policy)
            Policy:[Invalid direciton]
            created: Feb  5 09:25:06 2013  lastused: Feb  5 10:25:10 2013
            lifetime: 0(s) validtime: 0(s)
            spid=411 seq=1 pid=4415
            refcnt=1
    (per-socket policy)
            Policy:[Invalid direciton]
            created: Feb  5 09:25:06 2013  lastused: Feb  5 10:13:21 2013
            lifetime: 0(s) validtime: 0(s)
            spid=420 seq=2 pid=4415
            refcnt=1
    192.168.111.0/24[any] 192.168.0.0/24[any] any
            out prio def ipsec
            esp/tunnel/94.243.123.241-89.28.12.86/require
            created: Feb  5 09:25:13 2013  lastused: Feb  5 09:25:44 2013
            lifetime: 0(s) validtime: 0(s)
            spid=441 seq=3 pid=4415
            refcnt=1
    192.168.0.0/24[any] 192.168.111.0/24[any] any
            in prio def ipsec
            esp/tunnel/89.28.12.86-94.243.123.241/require
            created: Feb  5 09:25:13 2013  lastused:
            lifetime: 0(s) validtime: 0(s)
            spid=448 seq=4 pid=4415
            refcnt=1
    192.168.0.0/24[any] 192.168.111.0/24[any] any
            fwd prio def ipsec
            esp/tunnel/89.28.12.86-94.243.123.241/require
            created: Feb  5 09:25:13 2013  lastused:
            lifetime: 0(s) validtime: 0(s)
            spid=458 seq=0 pid=4415
            refcnt=1

我只想从中得到这一行:

    192.168.111.0/24 192.168.0.0/24

不知道它行的位置

我已经进行了以下正则表达式构造,但它们不起作用:

    [root@localhost:~]# setkey -DP | sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(\/[0-9]{1,2}).*(([0-9]{1,3}\.){3}[0-9]{1,3})(\/[0-9]{1,2})/\1\2\3\4/p'
    192.168.111.0111./242.168.0.0[any] any
    192.168.0.00./242.168.111.0[any] any
    192.168.0.00./242.168.111.0[any] any

    [root@localhost:~]# setkey -DP | sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}).*(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2})/\1\2/p'
    192.168.111.0/24111.[any] any
    192.168.0.0/240.[any] any
    192.168.0.0/240.[any] any

错误在哪里?

提前谢谢你, Evgheni

4

2 回答 2

2

如果您想使用sed,那么 Thors 的答案就足够了。但是,假设您在文件中的第一个模式匹配之后,您可以简单地使用grepand xargs

< file grep -m 1 -oE "([0-9]{1,3}[\./]){4}[0-9]{1,2}" | xargs -n 2

结果:

192.168.111.0/24 192.168.0.0/24

如果你在所有比赛之后,放下-m 1旗帜。HTH。

于 2013-02-05T10:13:37.717 回答
2

我宁愿单独找到每组数字,可能是这样的:

sed -rn 's|[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2})|\1\n|g; s/\n[^\n]*$//; s/\n/ /gp'

输出:

192.168.111.0/24 192.168.0.0/24
192.168.0.0/24 192.168.111.0/24
192.168.0.0/24 192.168.111.0/24

但是,如果您想匹配这对组,您可以将第二个正则表达式更改为:

sed -rne 's/^(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2})[^0-9]*(([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}).*/\1 \3/p'
  1. 使用否定组[^0-9]*在数字组之间进行非贪婪匹配。
  2. 最后添加.*以匹配数字组之后的所有内容。
  3. 您想用第一个和第三个反向引用(\1\3)替换所有内容。反向引用根据其起始括号的位置编号。
于 2013-02-05T08:47:58.727 回答