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 -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

ただし、グループのペアを一致させたい場合は、2番目の正規表現を次のように変更できます。

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すべてを1番目と3番目の後方参照(および)に置き換えます\3。後方参照には、開始括弧の位置に基づいて番号が付けられます。
于 2013-02-05T08:47:58.727 に答える
2

を使用したい場合はsed、Thorsの回答で十分です。grepただし、ファイル内の最初のパターンマッチの後であると仮定すると、単純にandを使用できます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 に答える