LINUX.ORG.RU

сравнение 2-х строк, инверсных относительно пробела.

 , , , setkey


1

1

Всех приветствую.

Есть такой вопрос, имеется вывод информации для VPN туннеля в таком виде:

[root@localhost:~]# setkey -D
82.113.11.226 10.18.1.201
        esp mode=tunnel spi=143937423(0x08944f8f) reqid=0(0x00000000)
        E: 3des-cbc  c114543c 3049e8b8 c033e4ea 07e0054e 3e8ac254 f0dbb7f5
        A: hmac-md5  8461e21b 2318bb9c 352bee1d e24a0a53
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 09:52:41 2013   current: Jan 28 09:56:58 2013
        diff: 257(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 28 09:52:49 2013      hard: 0(s)      soft: 0(s)
        current: 852(bytes)     hard: 0(bytes)  soft: 0(bytes)
        allocated: 11   hard: 0 soft: 0
        sadb_seq=1 pid=12264 refcnt=0
10.18.1.201 82.113.11.226
        esp mode=tunnel spi=3053715472(0xb6040010) reqid=0(0x00000000)
        E: 3des-cbc  28c87550 a6c9a17b 37ad0b02 03567617 79647aeb 644563d8
        A: hmac-md5  0ef83de9 1b279a16 658eb176 dad37d50
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 09:52:41 2013   current: Jan 28 09:56:58 2013
        diff: 257(s)    hard: 3600(s)   soft: 2880(s)
        last: Jan 28 09:52:41 2013      hard: 0(s)      soft: 0(s)
        current: 1524(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 19   hard: 0 soft: 0
        sadb_seq=0 pid=12264 refcnt=0

Хочу вытащить информацию о присутствии линий с ip адресами и сравнить если правая часть первой строки равно левой части второй строки, разделённой пробелом и с точностью до наоборот. Пока получилось только такое:

[root@localhost:~]# setkey -D | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p'
82.113.11.226 10.18.1.201
10.18.1.201 82.113.11.226 

Т.е. строки можно сказать инверсионные относительно пробела. Может есть какой то красивый велосипед на sed или awk чтобы это сделать ?

Думал сделать через while read line, но понял, что в цикле у меня будет происходить взаимная подмена переменных перед их сравнением, поэтому буду признателен за любую помощь в этом велосипедике.


Ответ на: комментарий от anonymous

не совсем понятно ...

простите, но что то не очень понятно что вы этим хотели сказать.

Я хочу сравнить ip крест-накрест, было бы классно в одном потоке, но у вас получилось просто поменять их местами:

[root@localhost:~]# setkey -D | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' |
awk '{print $2 " " $1}'
10.18.30.213 82.113.11.226
82.113.11.226 10.18.30.213
[root@localhost:~]# setkey -D | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p'
82.113.11.226 10.18.30.213
10.18.30.213 82.113.11.226
 

Не улавливаю смысл этого тайного послания (

Aidjek
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Вы абсолютно правы, запутался в определениях.

Aidjek
() автор топика
Ответ на: комментарий от schizoid

Спасибо, я думал об этом решении, только перенести всё в одну строку и сравнить уже 1 с 4 и 2 с 3. В принципе на stackoverflow мне тоже на это намекнули.

Но было и другое решение, которое меня полностью устраивает:

setkey -D | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' |
awk 'NR==1 { a=$1; b=$2; next } !/^ / { print ($1==b && $2==a ? "match" : "none"
) }'
match
 

проверил его для всех 4 случаев, разного IP адреса и как не странно - оно работает. Так что оставляю на суд читателя, какое использовать.

Всем спасибо. Проблема решена.

Aidjek
() автор топика
setkey -D | \
gawk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/{
  if (!prev_line){
    prev_line=$0
  } else {
    print (prev_line == $2" "$1)
      ? "MATCH"
      : "NOT MATCH";
  }
}'
Slavaz ★★★★★
()
Ответ на: комментарий от schizoid

наверно проблема в grep от busybox

кстати решил проверить вашу версию, но ничего не получилось. Скорее всего связано с grep от busybox, который обрезан и не всегда отрабатывает как надо (проверено):

[root@localhost:~]# setkey -D | grep '^[0-9. ]\+$' | tr '\n' '|' | grep -q '\([^ ]
\+\) \([^ ]\+\)|\2 \1' && echo true || echo false
false
[root@localhost:~]# setkey -D
82.113.11.226 10.18.30.213
        esp mode=tunnel spi=132886197(0x07ebaeb5) reqid=0(0x00000000)
        E: 3des-cbc  7be1c6d0 e67adfc6 555b15df 4c92a838 a14ff6b8 a90d1700
        A: hmac-md5  f6704b2b 7599e099 568234c5 878749a2
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 10:42:28 2013   current: Jan 28 11:06:59 2013
        diff: 1471(s)   hard: 3600(s)   soft: 2880(s)
        last:                           hard: 0(s)      soft: 0(s)
        current: 0(bytes)       hard: 0(bytes)  soft: 0(bytes)
        allocated: 0    hard: 0 soft: 0
        sadb_seq=1 pid=17116 refcnt=0
10.18.30.213 82.113.11.226
        esp mode=tunnel spi=3389259792(0xca040010) reqid=0(0x00000000)
        E: 3des-cbc  b9732431 dd8a6efa 8d775cfc 9c64781a 5c206d4c 84d86b61
        A: hmac-md5  541c7163 e0ea81fb 10c98223 c01c4b01
        seq=0x00000000 replay=4 flags=0x00000000 state=mature
        created: Jan 28 10:42:28 2013   current: Jan 28 11:06:59 2013
        diff: 1471(s)   hard: 3600(s)   soft: 2880(s)
        last: Jan 28 10:42:28 2013      hard: 0(s)      soft: 0(s)
        current: 2268(bytes)    hard: 0(bytes)  soft: 0(bytes)
        allocated: 27   hard: 0 soft: 0
        sadb_seq=0 pid=17116 refcnt=0
 
Aidjek
() автор топика
Ответ на: наверно проблема в grep от busybox от Aidjek

Возможно, setkey -D строки с айпишника выводит не в формате '^[0-9. ]\+$'. Может, пробелы лишние в конце или ещё чего. У меня на этом тексте всё отработало.

schizoid ★★★
()
Ответ на: в busybox нет gawk от Aidjek

попробуйте вместо gawk указать awk.

Я запускал gawk с ключиком -P (This turns on compatibility mode) - отработало. По идее и в «голом» awk должно, даже в бизибоксовом.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

К сожалению, тот же результат

[root@localhost:~]# setkey -D | \
> awk '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} [0-9]{1,3}\.[0-9]{1,3}\.
[0-9]{1,3}\.[0-9]{1,3}/{
>   if (!prev_line){
>     prev_line=$0
>   } else {
>     print (prev_line == $2" "$1)
>       ? "MATCH"
>       : "NOT MATCH";
>   }
> }'
awk: cmd. line:6: Unexpected token
 

конечно же попробовал и через скрипт запустить, результат тот же. Но всё равно спасибо за старания, можете не зацикливаться на этом ;)

Aidjek
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.