LINUX.ORG.RU

Избранные сообщения Aidjek

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

Форум — General

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

Есть такой вопрос, имеется вывод информации для 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, но понял, что в цикле у меня будет происходить взаимная подмена переменных перед их сравнением, поэтому буду признателен за любую помощь в этом велосипедике.

 , , , setkey

Aidjek
()

awk, куда же без него

Форум — General

Всех приветствую, есть такая задачка... Есть файл checksum, который состоит из 3х столбцов: md5sum, file_name, permission for chmod.

804567c6efce1755d11fc6ebbb263aa7  /mnt/dcu/mysql/bin/mysqld_safe        0755
f7e0baa7e97ea3075afec0e248e85b0d  /mnt/dcu/mysql/bin/mysql_install_db   0755
3388b314d96df3e372135d88b0fd48fb  /mnt/dcu/mysql/bin/mysqladmin 0755
73fdf21d66c328d3eb3c3d042783e1d8  /mnt/dcu/mysql/bin/resolveip  0755
47394f1c3430227b647d7e60d81dbe70  /mnt/dcu/mysql/bin/mysql      0755
00394418de5b9581bcce9ac7a51cff21  /mnt/dcu/mysql/bin/mysqlcheck 0755
338953d9c90ed4fc5ddd107af797fd1e  /mnt/dcu/mysql/bin/mysqldump  0755
5efb889b87b305e658db83ba3fe83bb8  /mnt/dcu/mysql/bin/myisamchk  0755

Хочется написать 2 конструкции: 1) которую я уже сделал - чтобы awk пробегал по строчкам, выбирал $3 и делал chmod $3 $2.

awk '{ if ($3 != "") { print | "chmod " $3 " "$2} }' checksum

2) задача - надо попробовать сделать так: чтобы awk брал $2, делал ему md5sum и сравнивал с $1. Если всё ок, то сообщал об этом. Написал такую штуку:

awk '{ if ($3 != "") { 
	if ( { print | "md5sum " $2} == $1) { 
		print "md5sum is correct"; 
		} 
	else { 
		print "md5sum is incorrect";
		}
	}
}' checksum

Но потом понял, что она у меня не сработает, потому что md5sum выдаётся в таком виде:

[root@localhost:]# grep mysql checksum |  awk '{print | "md5sum " $2}'
804567c6efce1755d11fc6ebbb263aa7  /mnt/dcu/mysql/bin/mysqld_safe
f7e0baa7e97ea3075afec0e248e85b0d  /mnt/dcu/mysql/bin/mysql_install_db
3388b314d96df3e372135d88b0fd48fb  /mnt/dcu/mysql/bin/mysqladmin
00394418de5b9581bcce9ac7a51cff21  /mnt/dcu/mysql/bin/mysqlcheck
47394f1c3430227b647d7e60d81dbe70  /mnt/dcu/mysql/bin/mysql
338953d9c90ed4fc5ddd107af797fd1e  /mnt/dcu/mysql/bin/mysqldump
beb812183e57b5dc59a8694f8ddba851  /mnt/dcu/mysql/bin/my_print_defaults
73fdf21d66c328d3eb3c3d042783e1d8  /mnt/dcu/mysql/bin/resolveip
5efb889b87b305e658db83ba3fe83bb8  /mnt/dcu/mysql/bin/myisamchk

Т.е. мне надо output от print опять пропускать через awk и выделять 1 столбец и смотреть если всё ок (мне почему то кажется что это можно сделать попроще)

Просьба варианты вида

for file in $(awk '{print $2}' checksum); do
	VALID_MD5=$(grep $file  checksum  | awk '{print $1}')
	CURRENT_MD5=$(/usr/bin/md5sum $file | awk '{print $1}')
	if [ "$VALID_MD5" = "$CURRENT_MD5" ] ; then
		echo "File $file has correct md5sum"
	else
		echo "md5sum for file $file is incorrect"
	fi
done

не предлагать.

потому что при попытке найти файл /mnt/dcu/mysql/bin/mysql grep выдаст сразу несколько вариантов и мне пришлось от него отказаться, да и делается это намного медленнее.(например 1 задачу, когда я переписал на awk - скорость увеличилась в 4 раза)

 ,

Aidjek
()

использование sed между 2-мя одинаковыми regexp'ами.

Форум — General

Лор привет,

Возникла такая ситуация:

есть выражение

ppp0:192.168.0.3:11000 eth0:192.168.102.80:11111

надо написать 3 функции через sed, можно по отдельности, которые заменяет сначала выражение между : и началом строки, потом между 2-мя : и наконец - между 2-ым : и пробелом. При этом 2часть после пробела изменения не должны касаться.

С первыми 2-мя выражениями я справился как смог:

[root@localhost:~]# a=wlan0 ; sed "s/[^:]*/$a/" /root/123
wlan0:192.168.0.3:11000 eth0:192.168.102.80:11111

[root@localhost:~]# a=wlan0 ;  sed "s/:[^:]*/:$a/" /root/123
ppp0:wlan0:11000 eth0:192.168.102.80:11111

А вот с 3-ей частью уже не хватает думалки.

Заранее благодарен

 ,

Aidjek
()