Moh*_*mad 5 linux grep text-processing
我有一个文件,其日期从 01/01/2020 到 04/04/2021 我想通过使用egrep 仅获取 01/03/2020 到 01/03/2021 之间的日期。我尝试做
egrep "([0][1-9]|[1-2][0-9]|[3][0]/[0][3-9]|[1][0-2]/[2][0][2][0-1])$" dates.txt
Run Code Online (Sandbox Code Playgroud)
但它仍然给我文件中的所有日期:
$ cat dates.txt
01/01/2020
24/01/2020
04/02/2020
23/02/2020
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
25/03/2021
04/04/2021
Run Code Online (Sandbox Code Playgroud)
使用给出的示例文件,其中日期按顺序排列,并且开始日期和结束日期都存在于文件中,您可能会发现awk
更简单的解决方案。
$ awk '$1=="01/03/2020",$1=="01/03/2021"' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
$
Run Code Online (Sandbox Code Playgroud)
egrep
顺便说一句,请注意,不建议使用,而是使用符合 POSIX 的grep -E
方法。
我真的不会尝试仅使用正则表达式来做到这一点。更复杂的工具会让事情变得更容易。例如,使用awk
:
$ awk -F/ '($3==2020 && $2 > 2) || ($3==2021 && ($2 < 3) || ($1< 2 && $2 == 3))' dates.txt
01/03/2020
13/03/2020
14/04/2020
29/05/2020
16/06/2020
17/07/2020
18/08/2020
19/09/2020
20/10/2020
21/11/2020
22/12/2020
23/01/2021
24/02/2021
01/03/2021
Run Code Online (Sandbox Code Playgroud)
将awk
字段分隔符设置为/
,然后简单地选择与这三个条件之一匹配的行:
2020
,第二个字段(月份)大于2
。这将匹配从01/03/2020
到的所有日期31/12/2020
。2021
并且
3
OR2
,第二个字段(月份)正好是3
。