当与awk一起使用时,在bash中的grep结果后,取得n行的Unix命令不起作用

-1 unix bash awk

我试图在一个时间帧之间获取日志,我能够用下面的命令成功地完成它(虽然它给出了理想的结果)

file.log
2016年8月10日13时53分35秒org.apache.axis2.AxisFault:连接被拒绝
2016年8月10日13时53分36秒的东西等等等等等等

cat file.log\
  | grep "refused" \
  | awk -F, \
      -v b='`date --date="10 minutes ago" +"%F %T"`' \
      -v e='date +"%F %T"' \
      -v date="$(date +"%F %T")" \
      '{ if ($1 >= b && $1 <= e) print $0,date }'
Run Code Online (Sandbox Code Playgroud)

返回:2016-08-10 13:53:35 org.apache.axis2.AxisFault:连接被拒绝

但是,现在要捕获有关错误/异常的更多信息,我想在ERROR碰巧知道异常类型后再打印3-5行,

预计输出:
2016-08-10 13:53:35 org.apache.axis2.AxisFault:连接被拒绝
2016-08-10 13:53:36什么等等等等等等等等等

我正在使用:cat filename | grep -A 2"拒绝"| awk -F,-vb =' date --date="10 minutes ago" +"%F %T"' - ve =' date +"%F%T"'\ - v date ="$(date +"%F%T")"'{if($ 1> = b && $ 1 <= e)打印$ 0,日期}'

返回:
2016-08-10 13:53:35 org.apache.axis2.AxisFault:连接被拒绝

使用'-A 2'似乎对输出没有影响.有什么建议??

注意:如果我不使用awk,则以下命令可以正常工作,因为预期的cat filename | grep -A 3"ERROR"

Mat*_*vid 5

尝试:

awk \
    -F, \
    -v b="$(date --date "10 mins ago" +"%F %T")"
    -v e="$(date  +"%F %T")" '
/ERROR|WARNING/ && ($1 " " $2)>=b && ($1 " " $2)<=e {print; cnt=5; next}
cnt>0 {print; --cnt}
' <filename
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 不需要grep,每次找到匹配时,将计数器设置为5.
  • 使用计数器在每个匹配项下方打印5条不匹配的行.
  • 您的变量赋值在OP中看起来很有趣:有些是双引号,有些是单引号.只有类型的那些-v var="$(date ...)"将由shell运行,看起来像那些-v var='<backtick>...<backtick>'awk作为文字字符串传递,这不是你想要的.
  • date在编辑OP后删除了额外的变量,因为我认为没有必要.
  • 日期和时间将显示为$1$2awk.在与bor 比较之前e,你需要将它们一起作为字符串,用空格分隔.

  • 你可以替换`cnt> 0 {print; --cnt}`用`cnt && cnt - ` (3认同)
  • @karakfa:为什么有人想让事情变得比现在更加模糊? (2认同)