Всех приветствую.
появилась такая интересная(по крайне мере для меня) проблема. Я уже недавно спрашивал про проверку 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 и что его нужно передать в качестве переменной.
Буду благодарен любому тычку !