【问题标题】:pull last 5 minutes of syslog data (750mb) with tac combo sed/awk/grep/?使用 tac 组合 sed/awk/grep/? 提取最后 5 分钟的系统日志数据 (750mb)
【发布时间】:2013-07-04 00:05:56
【问题描述】:

尝试使用(grep 匹配)提取最后 5 分钟的日志

所以我做一个tac syslog.log | sed / date -d "5 minutes ago"

日志的每一行都显示这种格式

Jun 14 14:03:58  
Jul  3 08:04:35 

所以我真的很想从

获取数据检查
Jul  4 08:12
Jul  4 08:17

我尝试了这种方法,但 KINDA 有效(尽管它仍然每天从 08:12:到 08:17:适合)

e=""
for (( i = 5; i >= 0; i-- ))
do
    e='-e /'`date +\%R -d "-$i min"`':/p '$e; 
done

tac /var/log/syslog.log | sed -n $e 

【问题讨论】:

  • 我想我几乎用这个 dt=$(date '+%b %e %H:%M:' -d '6 minutes ago'); tac var/log/routers.log | sed '/"$dt"/q
  • 发现我的系统日志转储了错误的时间信息,因为每个开关实际上可能会关闭 30 秒或需要 20 秒后才能进入系统日志,因此它可能会在时间范围之后丢失日志。

标签: bash sed awk grep


【解决方案1】:
e=""
for (( i = 5; i >= 0; i-- ))
do
    if [[ -z $e ]]
    then e=`date +\%R -d "-$i min"`
    else e=$e'\|'`date +\%R -d "-$i min"`
    fi
done
re=' \('$e'\):'
tac /var/log/syslog.log | sed -n -e "/$re/p" -e "/$re/!q"

这将创建一个正则表达式,列出过去 5 分钟内的所有时间,并与 \| 连接。它打印与它们匹配的行。然后它使用 ! 修饰符在第一行与 RE 不匹配时退出。

【讨论】:

  • ohhhhh 有趣我现在要试试这个
  • 它在 !q -bash: !q" 上失败:找不到事件
  • 这是因为您是在交互式 shell 中执行此操作的,其中 ! 用于历史替换。将其放入脚本中。
  • 上面的那个方法实际上只是失败了我打算尝试在它前面添加日期 7 月 17 日
  • 所以我尝试添加这个然后 e=date +\%b' '\%e' '\%R -d "-$i min" else e=$e'\|'date +\%b' '\%e' '\%R -d "-$i min" 并且它与 DAY 一样好,但我认为 SED 不喜欢这个空间
【解决方案2】:

如果您知道日期的格式,那何乐而不为:

tac syslog.log | awk '/Jul  4 08:17/,/Jul  4 08:12/ { print } /Jul 4 08:11/ {exit}'

/ .. /,/ .. / 是正则表达式范围。它将打印此范围内的所有内容。因此,一旦您在您的线路上看到/Jul 4 08:11/,这意味着您的 5 分钟窗口已被捕获,您就退出阅读该文件。

【讨论】:

  • 我切换到这个但现在它失败了,如果日志中没有任何内容说 08:11 那么它失败并显示自系统日志的 2 天以来的所有内容....有没有办法在 {exit} 上设置 2 分钟的范围
  • 这可能是矫枉过正,但退出,如果一开始什么都没有,就像 08:17 什么都没有,那么它不会拉任何东西
  • 考虑做这个 tac syslog.log | egrep "8 月 28 日 05:59|8 月 28 日 05:58|8 月 28 日 05:57|8 月 28 日 05:56|8 月 28 日 05:55"
【解决方案3】:

所以它并没有真正适用于上述方法但我认为我得到了它的工作

如果我看到这个,我为 {exit} 添加了一个范围

awk '/'"$dtnow"'/,/'"$dt6min"'/ { print } /'"$dt7min"'/,/'"$dt11min"'/ {exit}'

我再次测试它似乎可以工作

【讨论】:

  • 看起来还是失败了
【解决方案4】:

OK 终于看起来这次它真的有效了(它在一小时后使用 SED 而不是 awk 退出,最终让它通过一些测试运行。

tac /var/log/syslog.log | sed -e "$( date -d '-1 hour -6 minutes' '+/^%b %e %H:/q;' 
   date -d '-1 day -6 minutes' '+/^%b %e /q;'
      date -d '-1 month -6 minutes' '+/^%b /q;'
for ((o=0;o<=5;o++)) do date -d "-$o minutes" '+/^%b %e %R:/p;'; done ; echo d)"

【讨论】:

    【解决方案5】:

    如果日志条目从“5 月 14 日 11:41”开始,则有效。变量 LASTMINUTES 用于设置日志中的最后 n 分钟:

    cat log | awk 'BEGIN{ LASTMINUTES=30; for (L=0;L<=LASTMINUTES;L++) TAB[strftime("%b %d %H:%M",systime()-L*60)] } { if (substr($0,0,12) in TAB) print $0 }'
    

    【讨论】:

      【解决方案6】:

      要运行上述脚本,您需要 gawk,可以通过以下方式安装:

      apt-get install gawk
      

      或

      yum install gawk
      

      【讨论】:

      • 您应该对您正在谈论的任何脚本进行评论,以便清楚您在说什么。答案也旨在回答原始问题,而这不是。
      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2018-08-23
      • 2022-11-30
      • 2021-11-28
      • 2016-05-07
      • 2012-08-02
      • 1970-01-01
      相关资源
      最近更新 更多