如何使用sed或grep从user.txt日志中提取@符号前的有效用户名
问题原因分析
你那条删除@及后续字符的sed命令不生效的原因如下:
- 第一,绝大多数sed实现(包括常用的GNU sed)不支持
\D这个代表「非数字」的简写元字符,你写的\D会被识别为普通大写字母D,自然匹配不到@spookysec.local这类内容,因此替换完全没有生效。 - 第二,即使你修正了匹配规则,这条命令也只能删除@及之后的域名后缀,行首的时间戳、
> [+] VALID USERNAME:这些前缀内容依然会保留,无法直接得到纯净的用户名。
另外你之前用两次固定长度截取的方案鲁棒性很差,只要后续日志里的前缀空格、域名长度发生变化,结果就会出错。
最优实现方案
sed 单命令一步实现(无需中间文件)
直接使用捕获组提取用户名,命令如下:
sed -r 's/.*VALID USERNAME: +([^@]+)@.*/\1/' user.txt
规则说明:
.*VALID USERNAME: +匹配从行首到「VALID USERNAME:」加后面任意多个空格的所有前缀内容([^@]+)捕获@符号之前的所有连续字符,也就是你要的用户名@.*匹配@符号之后到行尾的所有后缀内容- 最后将整行替换为第一个捕获组
\1,直接输出纯净用户名
grep 实现方案
如果习惯用grep,可以用Perl兼容正则+正向断言实现:
grep -oP '(?<=VALID USERNAME: )[^@]+' user.txt
规则说明:
-P开启Perl兼容正则支持,-o只输出匹配到的内容(?<=VALID USERNAME: )是正向零宽断言,定位到「VALID USERNAME: 」之后的位置[^@]+匹配从定位位置到@符号之前的所有内容,就是目标用户名
内容的提问来源于stack exchange,提问作者ehehehehehehe
相关产品推荐
相关产品推荐

