Yur*_*rev 0 command-line sed text-processing
我有日志文件。我想从特定行中提取电子邮件列表。示例日志文件:
05:06:48,311 INFO http-nio-8080-exec-81 controller.IndexController:221 - Attempt to login: [xxx@yyy.com]. Headers: ["content-length": "52", ...]
15:06:48,311 INFO http-nio-8080-exec-81 controller.IndexController:221 - Attempt to login: [xxx@yyy.com]. Headers: ["content-length": "52", ...]
09:40:21,187 INFO http-nio-8080-exec-31 security.AuthAuthenticationProvider:81 - User: [16167]. Wrong code. Telegram: [0]. Google: [0]
Run Code Online (Sandbox Code Playgroud)
我的脚本:
cat file.log | sed -r 's/.*Attempt to login: \[(.*)\]\..*/\1/' | sort | uniq > file.log.filtered.txt
Run Code Online (Sandbox Code Playgroud)
我得到 file.log.filtered.txt:
09:40:21,187 INFO http-nio-8080-exec-31 security.AuthAuthenticationProvider:81 - User: [16167]. Wrong code. Telegram: [0]. Google: [0]
xxx@yyy.com
Run Code Online (Sandbox Code Playgroud)
为什么我在过滤后的文件中有一行“AuthAuthenticationProvider”?
因为您sed仅在包含 : 的Attempt to login行上运行命令,所以其他行将保持不变。
您可以像这样更改代码:
grep 'Attempt' file.log | sed -r 's/.*Attempt to login: \[(.*)\]\..*/\1/' | sort | uniq > file.log.filtered.txt
Run Code Online (Sandbox Code Playgroud)
所以它首先排除其他行,然后提取电子邮件地址。
或者这个:
sed -re 's/.*Attempt to login: \[(.*@.*)\]\..*/\1/;t;d' file.log | sort | uniq
Run Code Online (Sandbox Code Playgroud)
甚至这个:
sed -nr 's/.*Attempt to login: \[(.*@.*)\]\..*/\1/p' file.log | sort | uniq
Run Code Online (Sandbox Code Playgroud)
或者只使用 grep:
grep 'Attempt' file.log | grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' | sort | uniq
Run Code Online (Sandbox Code Playgroud)
此处为最后一个命令形式的正则表达式
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |