【问题标题】:print the line which is satisfying my condition and also the line next to it - awk打印满足我条件的行以及它旁边的行 - awk
【发布时间】:2015-11-15 06:39:30
【问题描述】:
tail -3000 ${file}.* | awk -vstart="${logStartTime}" -vend="${logEndTime}" \
  -vdate="${logDate}" '$1 == date && $2 > start && $2 < end {p=1} \
  $1 == date && $2 > end {p=0} p == 1 {print}'

目前我可以打印满足条件的行,但我想打印满足条件的行以及它旁边的行。

【问题讨论】:

  • next to it 是什么意思?在它之前或之后或两者兼而有之或其他什么?编辑您的问题以显示一些示例输入和预期输出。

标签: unix awk text-processing gawk


【解决方案1】:

这可以简化一点:

tail -3000 ${file}.* | awk -vstart="${logStartTime}" -vend="${logEndTime}" \
  -vdate="${logDate}" '$1 == date && $2 > start && $2 < end {print; getline; print}'

条件后面的print 只打印该行(无需设置变量并稍后检查)。使用getline,awk 将下一行读入它的缓冲区,然后print 再次打印该行。

【讨论】:

  • 如果匹配行出现在文件的末尾,它会打印两次,并且有所有其他常见的 getline 警告。如果您曾经考虑使用 getline,请确保您首先阅读并完全理解 awk.info/?tip/getline(然后您就不会将它用于此类事情)。
【解决方案2】:

这个 awk 习语就可以了

awk '/pattern/||!(n=!n)'

如果匹配模式或未设置 n 则打印,在评估该前提后将返回。

在您的情况下,将/pattern/ 替换为您的情况

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多