我需要从包含日期时间戳的文件中提取信息,如下所示
[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
通常不要尝试用正则表达式匹配数字,做数字比较,例如使用任何 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
如果很大程度上取决于输入,但对于您的示例和具有相同格式的任何其他行,这就可以了
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
旁注:如果你只想提取年号而不提取其他内容,请尝试这种免提方法:
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
这几乎满足了我的需要
grep -E ".*\[[^][]*\/2023[^][]*\].*" file
谢谢@Verpous
您尝试过的正则表达式
grep -E "\[.*(\/2023)*\]"
在右括号后缺少.
。应该是grep -E "\[.*(\/2023).*\]"