Показывать только записи последнего часа файла журнала

Ответ находится в man ls,

   -I, --ignore=PATTERN
          do not list implied entries matching shell PATTERN

Другими словами, вы попросили lsпроигнорировать этот файл и указать только другие файлы.

Если вам нужен длинный список, вы должны использовать опцию -lнижний регистр 'ell'.

   -l     use a long listing format

Так что попробуй

ls -l myFile
1
05.03.2021, 06:06
1 ответ
#!/bin/bash

age() { python -c '
import sys
from datetime import datetime
print(int((datetime.now() - datetime.strptime(sys.argv[1], sys.argv[2])).seconds))
' "$@"
}

tac access.log | while IFS= read line; do
    date=$(cut -d' ' -f4 <<< "$line")
    age=$(age "$date" "[%d/%b/%Y:%H:%M:%S")
    [ $age -gt 3600 ] && break
    printf '%s\n' "$line"
done

Пояснение:

  • Создайте функцию для получения возраста строки даты, я использую для этого модуль pythondatetime.
  • Затем зациклите строки файла в обратном порядке с помощьюtac log | while...
  • Получите строку даты с помощью cut.
    • вам нужно удалить -d' ', если ваш разделитель - табуляция вместо пробела
    • или используйте awk '{print $4}' <<< "$line"вместо
    • или используйте read ip some thing date tz else <<< "$line").
  • Получите возраст с помощью функции, которую мы определили на первом шаге
  • Когда секунды > 3600 (= 1 часу ), останов цикла(break)
  • В противном случае напечатайте строку (или сделайте что-то еще)

Некоторые дополнительные примечания:

  • Поскольку я игнорирую часовой пояс (+0100 ), предполагается, что мы находимся в том же часовом поясе, что и файл журнала. Если у вас есть файлы журналов из других часовых поясов, вам может потребоваться улучшить функцию age. См. здесь и прочитайте дату как cut -d' ' -f4,5.

  • Очевидно, что все это можно сделать с помощью python, однако чтение файла в обратном порядке без необходимости чтения всего файла кажется не таким уж простым и мне просто нравится tac.

  • Вы можете использовать dateи bcили около того, чтобы вычислить возраст (, как это сделано здесь ),но поскольку ваш формат даты не поддерживается из коробки, это было бы больно. Имо, datetime.strptimeидеально подходит для этого.

  • Преимущество функции age:в том, что ее можно многократно использовать для любых задач. Просто назовите его тем же strptimeи прочтите его, задокументировано здесь .

    age "date_string" "format"
    
0
18.03.2021, 22:27

Теги

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