我有一个包含信用卡请求/响应信息的日志文件。此日志持续运行,生成具有不同日期和时间的字符串。我需要在整个日志中只找到小于特定日期和时间的字符串。下面是我的日志的一部分,以及使用grep查找特定日期的字符串的示例。
Friday, June 19, 2015 11:57:45 PM : Request:Capture
Order Number 000001
Credit Card Type: VI
使用grep -A 2 --text" 2015年6月19日" FirstData.log> FirstDataDate.log,我可以从2015年6月19日开始收到所有条目。由于这是一家午夜过夜的餐厅,因此日志将于2015年6月20日截止,以便在凌晨12:00之后进行交易。但是,我需要" business"一天(6月18日上午10:00 - 6月19日上午2:00)。我可以以某种方式使用相同字符串中列出的时间吗?正则表达式或awk命令会以任何方式帮助吗?
答案 0 :(得分:0)
脱离我的头顶,这可能会奏效。我不知道使用RegExs是解决此问题的最佳方法,但我可以为您提供一个RegEx,它将解决您在帖子(6月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)。如果这解决了你所追求的问题,请告诉我。如果没有,我很乐意提供更多帮助。
答案 1 :(得分:0)
这将打印从6月19日中午到6月20日中午的行:
sed -n -r '/June 19.+PM/,/June 20.+PM/p' FirstData.log | head -n -1
对于sed
单行,上午10:00到凌晨2:00的时间范围有点过于复杂。这个bash脚本应该可以工作:
#!/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