Извлечение нескольких файлов.gz и печать имени извлеченного файла
Я думаю, это легко, но я блокирую...
У меня есть каталог с серией файлов журналов (с сервера Minecraft…):
2014-09-28-1.log.gz
2014-09-29-1.log.gz
2014-09-30-1.log.gz
2014-10-01-1.log.gz
2014-10-02-1.log.gz
latest.log
Я хотел бы извлечь дату и время, когда пользователи вошли в систему. Однако, когда я делаю
gzcat *.gz | grep 'logged in'
Я получаю вывод, как это:
[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)
и т.п.
К сожалению, пока я получаю отметку времени, я не получаю дату. В идеале результат будет
2014-10-03 19:26:03 Foo logged in
2014-10-04 18:26:08 Baz logged in
2014-10-05 01:16:38 User logged in
Я понимаю, что мне может понадобиться и awk
скрипт, чтобы добраться до этого "идеального" вывода. Но есть ли сокращенное (не awk) решение, чтобы получить только дату, перемежаемую с листингом? Что-то вроде этого:
2014-10-03-1.log.gz
[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
2014-10-04-1.log.gz
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
2014-10-05-1.log.gz
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)
(т. е. имя файла перед выделенными битами внутри каждого файла) уже было бы очень полезно.
Обратите внимание, что в каждом файле журнала обычно много других записей - может быть несколько входов в систему и другие сообщения (которые меня сегодня не интересуют).
В краткой форме мой вопрос становится:
Могу ли я использовать
gzcat
таким образом, что он печатает имя каждого zip-файла перед передачей содержимого этого zip-файла вgrep
для дальнейшей обработки?
Я мог бы написать сценарий, чтобы сделать все это; но я ищу что-то умнее (мне было интересно, tee
может быть использован для печати имени файла в stderr
а также в качестве аргумента grep
, возможно.)
1 ответ
Это gzcat
предоставлено gzip
пакет? На моей машине openSUSE GNU/Linux бинарный файл называется zcat
, Если gzip
действительно установлен на вашем компьютере, то вы также должны иметь еще один бинарный файл zgrep
, который является просто сценарием оболочки, который распаковывает файлы в stdout
и вызывает grep
,
zgrep
принимает (почти) тот же набор аргументов, что и grep
, Так что вы можете сделать это:
$ zgrep -H 'вошел в систему' *.gz`
Это вернет вывод в следующем формате:
2014-10-03-1.log.gz: [19:26:03] [Поток сервера /INFO]: Foo[/ IP-адрес] вошел в систему с идентификатором объекта 193955 в (местоположение)
Вы могли бы заменить .gz:
только с пробелами используя либо
tr
или же sed
чтобы получить что-то близкое к вашему идеальному результату.