grep filtra expresiones regulares. Es muy bueno para filtrar líneas que contienen una palabra clave en particular, pero es difícil especificar un rango de fechas usando expresiones regulares. Por ejemplo, para obtener errores entre el 1 de enero, 20 :00 y el 3 de enero, 2 :00, debe aceptar todas las horas para el 2 de enero, pero solo por la tarde para el 1 de enero y solo temprano por la mañana para el 3 de enero. No puede separar la hora del día y la fecha, por ejemplo.
Es mucho más sencillo utilizar una herramienta más expresiva que pueda comparar fechas de forma nativa. Perl es un lenguaje popular para hacer este tipo de cosas y Python es una buena alternativa.
Aquí hay un ejemplo en Python:
import re
import time
f = open('/var/log/syslog')
line = f.readline()
while line:
# Get the date at the beginning of line with a regex
m = re.match(r'^([^\s]+\s+[^\s]+\s+[^\s]+)\s+', line)
# Parse the date
date = time.strptime(m.group(1), '%b %d %H:%M:%S')
# Compare with a given date
if date > time.strptime('Jun 6 14:00:00', '%b %d %H:%M:%S'):
print(line, end='')
# Read next line
line = f.readline()
Решение, использующее bash
и GNU date
:
#!/bin/bash
while IFS= read -r -u3 line1; do
IFS= read -r -u4 line2
start_date="$line1"
end_date="$line2"
difference=$(( $(date -d "$end_date" "+%s") - $(date -d "$start_date" "+%s") ))
echo "Start Date: $start_date; End Date: $end_date; Difference in seconds = $difference"
done 3<start-times.txt 4<end-times.txt
Файловые дескрипторы 3 и 4 используются для чтения из обоих файлов по одной строке за раз. Оттуда команда даты GNU используется для преобразования их во время эпохи. Для вычисления разницы используется арифметическое расширение Bash.
Пример вывода:
Start Date: 2019-01-08 04:14:59; End Date: 2019-01-08 04:15:50; Difference in seconds = 51
Start Date: 2019-01-08 04:16:57; End Date: 2019-01-08 04:17:02; Difference in seconds = 5
Существует межплатформенный -набор утилит командной строки, называемый Dateutils , который включает команду datediff
. Если вы работаете в Linux, есть большая вероятность, что вы сможете установить dateutils
с помощью менеджера пакетов.
Вы не указали, хотите ли вы это для Linux, Mac, BSD или какой-либо другой Unix, поэтому следующее может потребовать настройки для ваших нужд, но у меня это работает на Arch Linux:
$ paste start.txt end.txt | sed 's/ /T/g' | while read dates; do datediff $dates; done
51s
5s
Вы можете думать о конвейере как о состоящем из двух частей :while read dates; do datediff $dates; done
, который передает любые входные данные в datediff
для вычисления разницы; и часть paste start.txt end.txt | sed 's/ /T/g'
, которая предварительно обрабатывает необработанные данные в форму, подходящую для использования datediff
.
В частности, учитывая предоставленный вами пример ввода, вам нужно беспокоиться об экранировании пробелов; если бы данные остались в необработанном виде, datediff
подумал бы, что каждый пробел в файле указывает на отдельный аргумент. Например, это не будет подходящим входом:
$ paste start.txt end.txt
2019-01-08 04:14:59 2019-01-08 04:15:50
2019-01-08 04:16:57 2019-01-08 04:17:02
Поэтому я использую sed
для замены пробелов (, а не вкладок )на T
, чтобы соответствовать некоторым примерам из руководства datediff
(man datediff
):
$ paste start.txt end.txt | sed 's/ /T/g'
2019-01-08T04:14:59 2019-01-08T04:15:50
2019-01-08T04:16:57 2019-01-08T04:17:02
Эти данные теперь содержат только пробелы между предполагаемыми аргументами, и каждый аргумент представлен в форме, соответствующей примерам, представленным в руководстве.