使用bash在具有非特定时间戳的时间帧之间提取日志

时间:2017-11-02 05:14:48

标签: bash shell awk sed grep

我想在两个时间戳之间获取日志,但我没有特定的时间戳。如果我使用以下命令在日志中有特定的时间戳,我可以使用命令sed进行提取

 sed -rne '/$StartTime/,/$EndTime/'p <filename>

我的查询是,由于我从我的数据库中提取的特定 StartTime EndTime 可能不会出现在日志文件中,我将不得不提取使用&gt; =和&lt; = sign 在我提供的 StartTime EndTime 附近的时间之间进行记录。我尝试了以下命令,但它不起作用。

awk '$0>=st && $0<=et' st=$StartTime et=$EndTime <filename>

示例输入和输出

输入

从数据库检索的时间

StartTime - 2017-11-02 10:20:00

EndTime - 2017-11-02 11:20:00

日志中显示的时间

T1 - 2017-11-02 10:17:44

T2 - 2017-11-02 11:19:32

输出:T1&amp;之间的整个日志文字T2

示例日志

2017-03-03 10:43:18,736 [main] WARN  - ORACLE_HOSTNAME=xxxxxxxxxx[OVERRIDES: 
xxxxxxxxxxxxxxxx]
2017-03-03 10:43:18,736 [main] WARN  - NLS_DATE_FORMAT=DD-MON-YYYY 
HH24:MI:SS [OVERRIDES: DD-MON-YYYY HH24:MI:SS]
2017-03-03 10:43:18,736 [main] WARN  - xxxxUsername=MDMPIUSER [OVERRIDES: MDMPIUSER]
2017-03-03 10:43:18,736 [main] WARN  - BUNDLE_GEMFILE=uri:classloader://installer/Gemfile [OVERRIDES: uri:classloader://installer/Gemfile]
2017-03-03 10:43:18,736 [main] WARN  - TIMEOUT=900 [OVERRIDES: 900]
2017-03-03 10:43:18,736 [main] WARN  - SHLVL=4 [OVERRIDES: 4]
2017-03-03 10:43:18,736 [main] WARN  - HISTSIZE=1000 [OVERRIDES: 1000]
2017-03-03 10:43:18,736 [main] WARN  - JAVA_HOME=/usr/java/jdk1.8.0_60/jre [OVERRIDES: /usr/java/jdk1.8.0_60/jre]
2017-03-03 10:43:20,156 [main] WARN  - APP_PROPS=/home/xxx/conf/appProperties [OVERRIDES: /home/xxx/conf/appProperties]

1 个答案:

答案 0 :(得分:0)

你可以尝试

awk -v start="$StartTime" -v end="$EndTime" '
function fonct(date)
{
  gsub(/-|,| |:/,"",date)
  return date
}
BEGIN{
  start=fonct(start)
  end=fonct(end)
}
{
  a=fonct($1$2)
  if (a>=start && a<=end)print $0
}' infile