Возобновление dd с ошибками чтения, пропуск/поиск номеров

Когда вы используете двойные кавычки вместо одинарных, подстановка переменных будет работать между кавычками. При таком подходе вы должны заключать в кавычки все символы $и "в сценарии awkкак \$или \".

awk "/2019.07.16 0$counter:00/, /2019.07.16 0$((counter+1)):00:/" mylog.log |...

Обратите внимание, что решение с 0$counter:00и 0$((counter+1)):00работает, только если counter+1 < 10.

Если вы также хотите отфильтровать двухзначные -значения часов, вы можете использовать форматирование printf для строки часов:

start=$(printf "%2.2d" "$counter")
stop=$(printf "%2.2d" "$((counter+1))")

awk "/2019.07.16 $start:00:/, /2019.07.16 $stop:00:/" mylog.log |...

Если ваши фактические входные данные содержат дату и время в каждой строке и вам не нужна 00-я минута следующего часа, вы можете упростить шаблон:

awk "/2019.07.16 $start:/" mylog.log |...

Например, с start=07это должно напечатать все строки от 07:00:00до 07:59:59.

Благодаря этому упрощению вы также можете объединить два сценария awkв один.

awk "/2019.07.16 $start:/ && \$3 == \"-\" && \$4 != \"-\" {print \$4}" mylog.log | sort -u | wc -l

Примечание:sort -uдает тот же результат, что и sort | uniq.

Для лучшего решения мне нужно знать точный формат входных данных.

Предполагая, что дата находится в столбце 1, а время — в столбце 2, вы можете передать данные в awkкак переменные без раскрытия переменных оболочки в коде скрипта awk. Это решение позволяет использовать одинарные кавычки и позволяет избежать уязвимости внедрения кода и цитирования $или "в скрипте.

timepattern=$(printf "^%2.2d:" "$counter")
date="2019.07.16"

awk -v date="$date" -v timepattern="$timepattern" '$1 == date && $2 ~ timepattern && $3 == "-" && $4 != "-" {print $4}' mylog.log | sort -u | wc -l
3
26.05.2021, 13:51
2 ответа

Вы столкнулись с ошибками чтения, поэтому параметры conv=sync,noerrorпочти наверняка изменили поток данных, что, к сожалению, сделало ваш выходной файл бесполезным или, по крайней мере, неточной копией.

Каждый раз при неправильном чтении (коротком чтении )на входе опция conv=syncдополняет блок нулевыми байтами. Команда ddпопытается продолжить входной поток с того места, где он был остановлен, но теперь в выходной поток вставлено неизвестное количество байтов NUL.

Вам следует прекратить использование ddи использовать ddrescue, который был создан для восстановления данных с плохих носителей.

Ссылки на ответы по похожим темам

7
28.07.2021, 11:29

Используйте ddrescue . Он может читать поврежденные носители, «сохраняя» поврежденные части, в то время как dd не может.

Представьте исходные данные:

  +-+-+-+-+-+-+-+-+-+-+-+-+
  |a b c d e f g h i j k l|
  +-+-+-+-+-+-+-+-+-+-+-+-+

После повреждения(X)они выглядят так:

  +-+-+-+-+-+-+-+-+-+-+-+-+
  |a b c X X X X h i j k l|
  +-+-+-+-+-+-+-+-+-+-+-+-+

Что будет читать dd conv=sync,noerror:

  +-+-+-+-+-+-+-+-+
  |a b c h i j k l|
  +-+-+-+-+-+-+-+-+

Что будет читать ddrescue.

  +-+-+-+-+-+-+-+-+-+-+-+-+
  |a b c 0 0 0 0 h i j k l|
  +-+-+-+-+-+-+-+-+-+-+-+-+

Как вы можете видеть, исходное сообщение, прочитанное dd, искажено, и если вы создадите образ файловой системы таким образом, он станет непригодным для использования. Образ Ddrescue вы можете смонтировать без проблем, что поможет вам получить доступ к неповрежденным данным, как обычно, и поврежденным, чтобы их можно было легко отложить и обработать дальше.

2
28.07.2021, 11:29

Теги

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