LINUX.ORG.RU

awk и Sed от regexp до конца файла.

 , ,


0

1

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

появилась такая интересная(по крайне мере для меня) проблема. Я уже недавно спрашивал про проверку md5sum в файле со списком готовых md5sum и названий файлов. И всё это вылилось у меня в такой скрипт:

#!/bin/sh

MD5CHECK_FILE=checksum.md5
LOG_FILE=looooog

invalid_param(){
	echo FAILED
}

echo > $LOG_FILE
	awk '{ if ($3 != "") {
			oldsum = $1
			"md5sum " $2 | getline # all input parameters $1, $2, ... changed
			if ( oldsum == $1) {
				print | "echo \"File "$2" has correct md5sum\" | tee -a '$LOG_FILE'";
			}
			else {
				print system ("echo \"md5sum for file "$2" is incorrect\" | tee -a '$LOG_FILE' ") ; exit 1 ;
			}
		}
	}' $MD5CHECK_FILE
	if [ $? -eq 1 ] ; then
		invalid_param

	fi

Но неожиданно скрипт начал заканчиваться с ошибкой 141, в любом месте списка. И до конца понять, что именно это за ошибка - не получилось. Только некоторые бессвязные намёки на SIGPIPE, но ошибка возникает не всегда, поэтому я грешу на что то другое и нет времени разбираться что это. Также в ходе экспериментов возвращается и просто 1, хотя она не связана с ошибкой в проверке md5sum

File /mnt/dcu/bin/scripts/z7_08_002_dm_discovery_commands.sql has correct md5sum
File /mnt/dcu/bin/scripts/dc_07_alter_collected_data.sql has correct md5sum
+ [ 141 -eq 0 ]

И я решил написать простой костыль: имеем бесконечный цикл, который будет выполнять мою проверку по списку, но если возвращается 141 или 1 то проверка начинается с того места где она стопорнулась и дальше по файлу

#!/bin/sh

MD5CHECK_FILE=/mnt/dcu/updates/checksum.md5
LOG_FILE=/mnt/dcu/updates/looooog

invalid_param(){
	echo FAILED
	exit 2
}

 echo > $SWUPDATE_LOG_FILE
while true ; do 
	awk '{ if ($3 != "") {
			oldsum = $1
			"md5sum " $2 | getline # all input parameters $1, $2, ... changed
			if ( oldsum == $1) {
		# system("LAST_FILE="$2" && export LAST_FILE) -
		# думал переменную с последним проверенным файлом 
		# вытаскивать таким образом, но он не проканал, поэтому ещё 1 костыль переписал так
				print | "echo \"File "$2" has correct md5sum\" | tee -a '$LOG_FILE'";
			}
			else {
				print system ("echo \"md5sum for file "$2" is incorrect\" | tee -a '$LOG_FILE' ") ; exit 65 ;
			}
		}
	}' $MD5CHECK_FILE
	if [ $? -eq 0 ] ; then
		break
	elif [ $? -eq 65 ] ; then
		invalid_param
	elif [[ $? -eq 141 || $? -eq 1 ]] ; then
		LAST_FILE=$(tail -1 $LOG_FILE| awk '{print $2}'| sed 's~\/~\\\/~g')
		sed -n "/$LAST_FILE/,$p" $MD5CHECK_FILE
		continue
	fi
done

Но и тут меня поджидает неудача:

[root@localhost:~]# sed -n "/$(tail -1 looooog | awk '{print $2}'|sed 's~\/~\\\/~g')/,$p" checksum.md5
sed: no address after comma

Когда так 
[root@localhost:~]# tail -1 looooog | awk '{print $2}'| sed 's~\/~\\\/~g'
\/mnt\/dcu\/bin\/Add.Cosem.dll

[root@localhost:~]# sed -n '//mnt\/dcu\/bin\/Add/.Cosem.dll/,$p' checksum.md5
f46a65236b6a1d7ff12ce2b38e8306be  /mnt/dcu/bin/Add.Cosem.dll    0644
a388e708638b1b2e466eac2b83b1717c  /mnt/dcu/bin/Add.P32.Facade.dll       0644
c9fc5f2cd347f2e5434e2eecc9485f6c  /mnt/dcu/bin/Add.DC.Watchdog.dll      0644
b975c33311ca451eb0901e6f858b9bea  /mnt/dcu/dnstools/dig 0755
.......

А вот так не хочет:
[root@localhost:~]# sed -n "/\/mnt\/dcu\/bin\/Add.Cosem.dll/,$p" checksum.md5
sed: no address after comma

Т.е. проблема в одинарных и двойных кавычках, но именно благодаря двойным кавычкам я могу передавать значение переменной из shell в sed.

Ребята помогите победить сие костыли: 1) возможность передачи переменной из AWK, минуя парсинг лог файла на наличие записи о последнем успешном файле 2) как ещё можно отпарсить файл с помощью sed от regexp до его конца, учитывая что regexp это PATH_LINE и что его нужно передать в качестве переменной.

Буду благодарен любому тычку !


Вижу никто не отвечает, напишу как сам решил 1 из проблем, оказывается если сделать так:

sed -n '/'$(tail -1 looooog | awk '{print $2}'|sed 's~\/~\\\/~g')'/,$p' checksum.md5 

всё заработало.

Так что пользуйтесь, если кому то надо.

Aidjek
() автор топика

А вот так не хочет:
[root@localhost:~]# sed -n «/\/mnt\/dcu\/bin\/Add.Cosem.dll/,$p» checksum.md5

у тебя $p разворачивается шеллом в пустую строку, т.к. стоит в двойных кавычках

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