Я бы предложил следующий сценарий, в котором я сделал несколько изменений:
filetomonitor
while true
на цикл в течение 5 часов, основываясь на поведении переменной bash SECONDS
, которая подсчитывает количество секунд с момента запуска оболочки. Это начинается с нуля, когда стартует сценарий оболочки.$(... )
форму Обновленный скрипт:
#!/bin/bash
giveup=$((5 * 60 * 60))
filetomonitor='/tmp/file-to-monitor'
ltime=$(stat -c %Z "$filetomonitor")
while [[ "$SECONDS" -lt "$giveup" ]]
do
atime=$(stat -c %Z "$filetomonitor")
if [[ "$atime" -ne "$ltime" ]]
then
echo Take action
break ## if we're only supposed to act once
ltime=$atime
fi
sleep 5
done
Я оставил break
там, но закомментировал. Если вы хотите, чтобы скрипт завершал работу (раньше, чем через 5 часов )после выполнения действия, раскомментируйте строку break
; в противном случае текущая версия сценария будет выполняться в течение 5 часов (, возможно, дольше, если действие 70 -минут начинается в 4 :59 ), возможно, вызывая действие несколько раз.
Похоже, ваши поля разделены двоеточием или пробелом, за которым следуют дополнительные пробелы, поэтому просто установите FS соответствующим образом:
$ awk -F'[: ] +' 'NR>1{o=(o=="" ? "" : o OFS) $3} END{print o}' file
e9 f0 41 c8 b0 04 46 67 48 c0 ef 50 00 00 21 78 44 07 68 38 68 47 90 02 a8 40 f9 cd 0a 01 60 08 a8 f9 21 51 f1 62 ea 60 48 d4 e9 00 23
Мы можем извлечь информацию с помощью GNU grep с поддержкой регулярных выражений PCRE, а затем обработать их с помощью других утилит Linux. файл - это результат команды gdb, сохраненный в файл.
< file \
grep -Po ':\s*((\s\S+)+)\s{2}' |
paste -s - | tr -s '\t :' ' ' |
sed -E 's/^ | $//g'
Perl может извлечь их для вас:
perl -ne '
print(($"x!!$a++),$1) if /:\s+(\S.*?\S)\s{2}/;
}{printf $/;
' file
Выход:
e9 f0 41 c8 b0 04 46 67 48 c0 ef 50 00 00 21 78 44 07 68 38 68 47 90 02 a8 40 f9 cd 0a 01 60 08 a8 f9 21 51 f1 62 ea 60 48 d4 e9 00 23
python3 -c 'import sys
ifile = sys.argv[1]
L = []
with open(ifile) as fh:
for l in fh:
ln = l.rstrip()
if ln.find(":") < 0: continue
f1 = ln.split(":",1)[1].lstrip()
L += f1[0:f1.find(" ")].split()
print(*L)
' file
Включен потоковый редактор GNU sed в расширенном режиме регулярных выражений:
sed -En '
s/:\s*((\s[[:xdigit:]]{2})+)\s{2}/\n\1\n/;T
s/.*\n\s(.*)\n.*/\1/;H
$!d;g;s/.//;s/\s+/ /gp
' file