2017-02-05 23 views
0

У меня есть файл журнала, который содержит журналы следующимПолучить последние 30 минут из файла журнала

1486307866.155 240207 68.146.231.80 TCP_MISS/200 790 CONNECT clients1.google.com:443 - DIRECT/172.217.6.238 - 

1486307866.155 время в формате UNIX с соответствует в 2017-02-05 07:17:46 (Формат: Ymd H: я: s)

Мне нужна команда unix, которая дает мне журналы в течение последних 30 минут в следующем формате и отбрасывает любые детали, которые мне не нужны.

2017-02-05 07:17:46|68.146.231.80|clients1.google.com:443

+0

Даже временная метка Unix будет делать, как я могу использовать 'даты («YMD H: I: S»,«+1486307866,155»);' в PHP для преобразования временной метки – user2650277

ответ

3

Использование даты GNU и GNU AWK вы можете добиться того, что вы хотите:

awk -v bt=$(date "+%s" -d "30 minutes ago") '$1 > bt {printf("%s|%s|%s\n", strftime("%F %T",$1), $3, $7)} ' yourfile 

Объяснение:

  • команда дата date "+%s" -d "30 minutes ago" получает метку времени от 30 минут назад
  • команда date является заменой CED с его выходом с помощью команды подстановки функции $(...)
  • опции AWK -v передает, что метка время, как переменные с именем bt в сценарий AWK только
  • в скрипте печатает эти строки из файла, имеющие значение в колонке один ($1) большего чем bt в нужном формате
+0

Спасибо за помощь ... Можете ли вы обновить команду awk для фильтрации домена, например '* clients1.google.com *. Я обычно делал бы «grep -E» для этого, но я думаю, что awk будет делать лучше всего – user2650277

+0

@ user2650277: Почему бы вам не попробовать сделать это самостоятельно, а затем опубликовать новый Q, если вы не можете его решить? См. [Учебник awk] (http://grymoire.com/Unix/awk.html), чтобы получить некоторые основные идеи. Удачи – shellter

+1

@ user2650277 изменить условие перед printf на '($ 1> bt) && $ 7 ~/clients1.google.com /' –