Ответ находится в 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
#!/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
Пояснение:
python
datetime
. tac log | while...
cut
. -d' '
, если ваш разделитель - табуляция вместо пробела awk '{print $4}' <<< "$line"
вместо read ip some thing date tz else <<< "$line"
). break
)Некоторые дополнительные примечания:
Поскольку я игнорирую часовой пояс (+0100 ), предполагается, что мы находимся в том же часовом поясе, что и файл журнала. Если у вас есть файлы журналов из других часовых поясов, вам может потребоваться улучшить функцию age
. См. здесь и прочитайте дату как cut -d' ' -f4,5
.
Очевидно, что все это можно сделать с помощью python
, однако чтение файла в обратном порядке без необходимости чтения всего файла кажется не таким уж простым и мне просто нравится tac
.
Вы можете использовать date
и bc
или около того, чтобы вычислить возраст (, как это сделано здесь ),но поскольку ваш формат даты не поддерживается из коробки, это было бы больно. Имо, datetime.strptime
идеально подходит для этого.
Преимущество функции age
:в том, что ее можно многократно использовать для любых задач. Просто назовите его тем же strptime
и прочтите его, задокументировано здесь .
age "date_string" "format"