在终端上打印文件,在具有特定文本的行中开始和结束
例如: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
可以让您在 n
为 1
时打印每一行。当到达 "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/