2015-07-01 2 views
1

У меня есть файл журнала, содержащий информацию о кредитной/кредитной карте. Этот журнал непрерывно работает, генерируя строки с разными датами и временем. Мне нужно найти только строки меньше определенной даты и времени во всем журнале. Ниже приведена часть моего журнала и пример использования grep для поиска строк определенной даты.Как искать строки в файле журнала, где указанное время меньше значения?

Friday, June 19, 2015 11:57:45 PM : Request:Capture 
Order Number 000001 
Credit Card Type: VI 

Использование Grep -A 2 --text «19 июня 2015» FirstData.log> FirstDataDate.log, я могу получить все записи от 19 июня 2015 г. Учитывая то, что это ресторан открыт после полуночи, то log переключается на 20 июня 2015 года для транзакций, совершаемых после 12:00. Однако мне нужны все транзакции для «делового» дня (10:00 18 июня - 2:00 19 июня). Могу ли я каким-то образом использовать время, указанное в одной строке? Помогло ли регулярное выражение или команда awk?

ответ

0

Сверху моей головы это может сработать. Я не знаю, является ли использование RegExs наилучшим способом решения этой проблемы, но я могу предложить вам RegEx, который решит конкретную проблему, о которой вы говорили в своем сообщении (19-20 июня), где можно настроить даты и время закрытия довольно легко. Вы все еще можете обрабатывать все с помощью grep, что является своего рода аккуратным способом решения проблем без полномасштабного программирования.

June\s20,\s2015\s(12|[1-4]):[0-5][0-9]:[0-5][0-9]\sAM

Заменитель дата, что вы хотите. Также обратите внимание на класс символов [1-4]; замените 4 на любой желаемый час закрытия, и RegEx будет соответствовать вплоть до #: 59: 59 (например, 4:59:59). Дайте мне знать, если это касается вас. Если нет, я был бы рад предложить дополнительную помощь.

+0

Не будет ли этот поиск в течение определенного времени? По сути, мне нужно искать журнал для переменной даты и времени. В этом случае все записи между 10:00 утра 1 и 2:00 утра. 2 – Mike

0

Это будет печатать строки с полудня 19 июня до полудня 20 июня:

sed -n -r '/June 19.+PM/,/June 20.+PM/p' FirstData.log | head -n -1

Время Диапазон 10:00 утра до 2:00 утра немного слишком сложным для sed однострочника. Этот Баш скрипт должен работать:

#!/bin/bash 
day1="June 19, 2015" 
day2="June 20, 2015" 
open=$(date -d "$day1 10:00:00 AM" +%s) 
close=$(date -d "$day2 02:00:00 AM" +%s) 
matched=false 
while read line 
do 
    if [[ $line =~ "$day1" ]]; then 
     date=$(date -d "${line//M :*/M}" +%s) 
     if [[ $date -ge $open ]]; then 
      matched=true 
     fi 
    fi 
    if [[ $line =~ "$day2" ]]; then 
     date=$(date -d "${line//M :*/M}" +%s) 
     if [[ $date -ge $close ]]; then 
      matched=false 
     fi 
    fi 
    if ($matched == true); then 
     echo $line 
    fi 
done 

Сохраните сценарий как grepday.sh, сделать его исполняемым и запустить его с ./grepday.sh < FirstData.log

+0

. Это приблизило меня, поскольку это позволило установить дату/время. Тем не менее, я недостаточно знаком с регулярным выражением, чтобы сделать эту работу для моего сценария. Какой вход регулярного выражения можно использовать для поиска 19 июня 2015 года с 10:00 до 20 июня 2015 года 2:00:00? – Mike

+0

Я обновил свой ответ с помощью сценария bash, который должен делать то, что вам нужно. –