linux - 如何在 Linux/Unix 终端中开始和停止打印具有特定文本的行

标签 linux shell unix terminal

在终端上打印文件,在具有特定文本的行中开始和结束

例如:file.txt

2019/10/17 23:01:02 -W- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....

我尝试使用 grep cmd 显示这些行,但无法获得所需的输出。

预期结果: 根据系统日期获取结果的命令

> some command in grep (or) awk (or) sed with system date for current date

2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End

最佳答案

awk 中的一个简单方法是保留一个标志,并在字段 4 中遇到 "Start" 时设置 n = 1。检查 n == 1 可以让您在 n1 时打印每一行。当到达 "End" 时,只需打印该行并退出,例如

awk '$4 == "End" {print; exit} $4 == "Start" {n = 1} n == 1' file

(注意:与规则n == 1相关的操作只是print的默认操作。它相当于编写n == 1 {print})

示例使用/输出

使用file中的数据文件,您将得到:

$ awk '$4 == "End" {print; exit} $4 == "Start" {n = 1} n == 1' file
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End

也可以写成:

awk '$4 == "Start" {n = 1} n == 1; $4 == "End" {exit}' file

编辑 - 仅今天日期

如果您只想匹配今天的日期,您只需使用 -v 选项将日期以您需要的格式作为变量从 shell 传递给 awk,例如

awk -v date="$(date +%Y/%m/%d)" '
    $1 == date { 
        if($4 == "Start") n = 1
        if(n == 1) {print}
        if($4 == "End") exit
    }
' file

输入示例

$ cat file
2019/10/17 23:01:02 -W- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Blah Blah Blah.....
2019/10/17 23:01:02 -I- Start
2019/10/17 23:01:02 -I- ======================
2019/10/17 23:05:02 -I- Summary Details
2019/10/17 23:10:02 -I- End
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/17 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -W- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Blah Blah Blah.....
2019/10/20 23:01:02 -I- Start
2019/10/20 23:01:02 -I- ======================
2019/10/20 23:05:02 -I- Summary Details
2019/10/20 23:10:02 -I- End
2019/10/20 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:10:02 -I- Blah Blah Blah.....
2019/10/20 23:10:02 -I- Blah Blah Blah.....

使用/输出示例(2019/10/20)

$ awk -v date="$(date +%Y/%m/%d)" '
>     $1 == date {
>         if($4 == "Start") n = 1
>         if(n == 1) {print}
>         if($4 == "End") exit
>     }
> ' file
2019/10/20 23:01:02 -I- Start
2019/10/20 23:01:02 -I- ======================
2019/10/20 23:05:02 -I- Summary Details
2019/10/20 23:10:02 -I- End

如果您还有其他问题,请告诉我。

关于linux - 如何在 Linux/Unix 终端中开始和停止打印具有特定文本的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58471643/

相关文章:

Linux 库命名约定 : Capitalization?

php - 相当于 PHP 的 preg_replace() 的 Shell

linux - bash 合并开始和结束相同的行

linux - 如何删除与linux命令输出匹配的文件

shell - 从 shell 脚本发布下载到 bitbucket

xml - 提到开始和结束模式时,sed 正在删除多行

linux - 如何在 linux redhat 5 中给用户一个完整的权限

linux - 为什么使用 uImage 而不是 zImage

php - 如何将今天的日期添加到 .htaccess 日志文件名

unix - 使用 wget 下载图片文件夹