猜测 OP 的想法:
- 如果一行包含字符串 'To:' 和
- 该行在字段 #15 中也有一个数字,即 >= 2019 然后
- 打印上一行和当前行
还有一些假设:
- 文件中的第一行可以匹配
- 连续的行可以匹配 'To:/>=2019' 搜索:
- 对于所有感兴趣的行,“To”位于第 #15 字段之前
仅基于 OP 提供的一行的示例数据:
$ cat -n print15.dat
1 certificate1 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
2 this is line two
3 this is line three
4 certificate4 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
5 this is line five
6 this is line six
7 certificate7 - From: Friday, October 16, 2020 1:22:18 PM CEST To: Wednesday, October 16, 2017 1:32:16 PM CEST
8 this is line eight
9 this is line nine
10 certificate10 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2020 1:32:16 PM CEST
11 this is line eleven
12 certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
13 certificate13 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2024 1:32:16 PM CEST
14 this is line fourteen
应用所描述的逻辑,我们看到第 1、4、10、12 和 13 行匹配 'To:./>=2019'。
一个awk解决方案:
$ awk '/To:/ && $15 >= 2019 { printf "\n#############\n"
if (length(prevline) > 0) { print prevline }
print $0
printf "#############\n"
}
{ prevline=$0 }
' print15.dat
解释:
-
/To:/ && $15 >= 2019 :匹配模式为“To:”且字段 #15 >= 2019 的任何行(当然,这并不强制“To:”出现在字段 #15 之前)
-
print/######## : 简单的页眉/拖尾,以明显区分匹配行集
-
if/length/print : 如果 prevline 不为空,则打印它
-
print $0 :打印当前行(匹配 'To:' 和 $15>=2019)
-
prevline=$0 :将我们的“prevline”变量设置为当前行(用作我们处理的下一行的“上一行”)
还有输出:
#############
certificate1 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
#############
#############
this is line three
certificate4 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2019 1:32:16 PM CEST
#############
#############
this is line nine
certificate10 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2020 1:32:16 PM CEST
#############
#############
this is line eleven
certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
#############
#############
certificate12 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2023 1:32:16 PM CEST
certificate13 - From: Friday, October 16, 2009 1:22:18 PM CEST To: Wednesday, October 16, 2024 1:32:16 PM CEST
#############