Дизассемблирование GDB :Печатать только необработанные двоичные данные (с использованием столбца и awk)

Я бы предложил следующий сценарий, в котором я сделал несколько изменений:

  • использовались имена переменных нижнего -регистра
  • присвоил переменной «сдаться» с прописанным -выражением «5 часов в секундах»
  • параметризовал файл для мониторинга в переменной 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 ), возможно, вызывая действие несколько раз.

0
16.06.2021, 17:54
2 ответа

Похоже, ваши поля разделены двоеточием или пробелом, за которым следуют дополнительные пробелы, поэтому просто установите 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
3
28.07.2021, 11:24

Мы можем извлечь информацию с помощью 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
0
28.07.2021, 11:24

Теги

Похожие вопросы