Когда вы используете двойные кавычки вместо одинарных, подстановка переменных будет работать между кавычками. При таком подходе вы должны заключать в кавычки все символы $
и "
в сценарии 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
Вы столкнулись с ошибками чтения, поэтому параметры conv=sync,noerror
почти наверняка изменили поток данных, что, к сожалению, сделало ваш выходной файл бесполезным или, по крайней мере, неточной копией.
Каждый раз при неправильном чтении (коротком чтении )на входе опция conv=sync
дополняет блок нулевыми байтами. Команда dd
попытается продолжить входной поток с того места, где он был остановлен, но теперь в выходной поток вставлено неизвестное количество байтов NUL.
Вам следует прекратить использование dd
и использовать ddrescue
, который был создан для восстановления данных с плохих носителей.
Ссылки на ответы по похожим темам
Используйте 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 вы можете смонтировать без проблем, что поможет вам получить доступ к неповрежденным данным, как обычно, и поврежденным, чтобы их можно было легко отложить и обработать дальше.