#string #bash #logging #extract
#строка #bash #ведение журнала #извлечь
Вопрос:
У меня есть файл журнала в Linux, который содержит информацию такого типа:
20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Starting backup of database mydb
20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Backup Timestamp = 20200910165938
Мне нужно получить значение временной метки (20200910165938). Мне просто нужно что-нибудь после слова Временная метка, равно и пробел. В файле журнала есть только одно вхождение этой строки.
Как я могу этого добиться?
Ответ №1:
С awk
. Выведите последнее поле ( NF
) для строк, где Timestamp
это третье поле с конца ( NF-2
).
awk '$(NF-2)=="Timestamp" {print $NF}' file
Ответ №2:
Сначала давайте создадим файл тестовых данных.
cat <<EOF > data.txt
20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Starting backup of database mydb
20200910:16:59:38 gpbackup:gpadmin:mdw:024273-[INFO]:-Backup Timestamp = 20200910165938
Теперь используйте некоторые распространенные инструменты Unix для извлечения временной метки.
cat data.txt | grep Timestamp | rev | cut -d' ' -f1 | rev
- grep — находит правильную строку для обработки.
- rev — переворачивает строку так, чтобы первый пробел ограничивал конец временной метки.
- вырезать — извлекает обратную временную метку
- rev — переворачивает временную метку в надлежащую последовательность.
Ответ №3:
perl -lne 'print for /Timestamps =s (d )/;' logfile
Однострочник Perl использует эти флаги командной строки:
-e
: Указывает Perl искать код в строке, а не в файле.
-n
: Перебирайте входные данные по одной строке за раз, присваивая им значение $_
по умолчанию.
-l
: Удалите разделитель строк ввода ( "n"
по умолчанию * NIX) перед выполнением кода в строке и добавьте его при печати.
Регулярное выражение работает следующим образом:
s
: 1 или более пробелов.
d
: 1 или более цифр.
(d )
: захват 1 или более цифр. Если регулярное выражение совпадает, это «группа захвата» (здесь, временная метка) возвращается регулярным выражением в виде списка, а затем печатается. Если регулярное выражение не совпадает, возвращается пустой список, и ничего не печатается.
СМОТРИТЕ ТАКЖЕ:
perldoc perlrun
: как запустить интерпретатор Perl: переключатели командной строки
perldoc perlre
: Регулярные выражения Perl (regexes)
perldoc perlre
: Регулярные выражения Perl (regexes): кванторы; Классы символов и другие специальные экранирования; Утверждения; Группы захвата