AIX grep 正则表达式

问题描述 投票:0回答:5

我需要从包含日期时间戳的文件中提取信息,如下所示

[01/Sep/2023:08:10:45 +0200]

我想在 AIX 上使用 grep 匹配 2023 年的所有行

我试过

grep -E "\[.*(\/2023)*\]"
但没用。

好吧 - 我不太清楚它看起来像..这是来自实际文件的示例数据

10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.218.72.116 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.218.72.116 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279

我预计输出只是最后两行,因为它们是在 2023 年,不管下面的其他内容如何

10.218.72.116 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
bash grep aix
5个回答
2
投票

通常不要尝试用正则表达式匹配数字,做数字比较,例如使用任何 awk:

$ awk -F'[/:]' '$3 == 2023' file
10.218.72.116 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279

然后您可以通过将

==
更改为
<
>
等,简单地使其适应在那一年之前或之后的打印行,例如:

$ awk -F'[/:]' '$3 < 2023' file
10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.218.72.116 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279

1
投票

如果很大程度上取决于输入,但对于您的示例和具有相同格式的任何其他行,这就可以了

grep '/2023:' file

导致

10.218.72.116 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279

0
投票

旁注:如果你只想提取年号而不提取其他内容,请尝试这种免提方法:

echo '

10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.218.72.116 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.239.45.25 - - [01/Sep/2022:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.218.72.116 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279
10.66.244.120 - - [01/Sep/2023:08:10:45 +0200] "GET /favicon.ico HTTP/1.1" 403 279' | 
{m,g,n}awk ++NF FS='[^:]+/|:.+$' OFS= 
2022
2022
2022
2022
2023
2023

0
投票

这几乎满足了我的需要

grep -E ".*\[[^][]*\/2023[^][]*\].*" file

谢谢@Verpous


-1
投票

您尝试过的正则表达式

grep -E "\[.*(\/2023)*\]"
在右括号后缺少
.
。应该是
grep -E "\[.*(\/2023).*\]"

© www.soinside.com 2019 - 2024. All rights reserved.