извлечение нескольких файлов .gz и печать имени извлеченного файла

656
Floris

Я думаю, это легко, но я блокирую ...

У меня есть каталог с серией файлов журналов (с сервера 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, возможно.)

0

1 ответ на вопрос

2
Srinidhi

Это 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чтобы получить что-то близкое к вашему идеальному выводу .

Это делает работу очень хорошо. Спасибо! Я не понимал, что есть команда, которая объединяет unzip и grep, и позволяет мне включать имя файла как часть вывода - блестящий. Поздравляем с первым принятым ответом! Floris 9 лет назад 0

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