сценарий оболочки unix - извлечение результата из двух файлов .txt (операция времени) [дубликат]

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()
-1
19.01.2019, 01:23
2 ответа

Решение, использующее 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
0
28.01.2020, 05:09

Существует межплатформенный -набор утилит командной строки, называемый 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

Эти данные теперь содержат только пробелы между предполагаемыми аргументами, и каждый аргумент представлен в форме, соответствующей примерам, представленным в руководстве.

1
28.01.2020, 05:09

Теги

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