Используйте awk для извлечения из файла определенного раздела

findимеет действие fprint, которое может записывать результаты команды find в файл. Затем вы можете расширить свою команду как:

find $backup_path/$HOSTNAME.*.img -mtime +$retention_days -type f -fprint /path/to/log.txt -delete

Затем вы можете получить количество файлов из файла журнала, используяwc:

cat /path/to/log.txt | wc -l

Если в результатах поиска могут появляться специальные символы, в качестве альтернативы можно использовать опцию fprint0. Это запишет результаты в указанный файл в виде строк с нулевыми разделителями -.

Чтобы подсчитать элементы в результирующем файле, вы можете просмотреть параметры, обсуждаемые в этом вопросе.:Подсчитать элементы с нулевым разделителем в файле .

0
22.01.2021, 01:51
2 ответа

Если я вас правильно понял, вы хотите вывести строки между первым и следующим вхождением SEVEREпосле последнее вхождение Server version.

Пример входного файла:

Server version
SEVERE
ignore
SEVERE
Server version
ignore
SEVERE
important
stuff
SEVERE 
ignore
SEVERE
awk '
  /Server version/{ chunk="" }
  /SEVERE/{ logme=(chunk=="") }
  logme{ chunk=chunk $0 RS }
  END{ printf "%s", chunk }
' file

Выход:

SEVERE
important
stuff
1
18.03.2021, 22:35

Многострочный -контур :Выведите номера строк с помощью grep, извлеките их и используйте awk

grep -n SEVERE filename | head -n 2 | cut -d ':' -f1

Это выведет первые 2 номера строки [a, b], содержащие «СЕРЬЕЗНЫЙ», и awk может легко напечатать СЕРЬЕЗНЫЙ и промежуточные строки...

awk 'NR>=a && NR<=b {print $0;}' filename

Это можно легко реализовать в сценарии -, но для этого требуется двойной проход по файлу журнала.

1
18.03.2021, 22:35

Теги

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