我有一个包含许多错误行的日志文件,例如:
Failed to add email@test.com to database
Run Code Online (Sandbox Code Playgroud)
我可以通过一个grep调用过滤这些行:
grep -E 'Failed to add (.*) to database'
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但我真正想做的是使用grep(或者我将输出传递到其他Unix命令)只输出匹配行的电子邮件地址部分.
这可能吗?
Mac*_*ski 15
sed
没有grep很好:
sed -n 's/Failed to add \(.*\) to database/\1/p' filename
Run Code Online (Sandbox Code Playgroud)
你可以使用sed:
grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
Run Code Online (Sandbox Code Playgroud)
最新版本的 GNU grep 有一个-o
选项可以完全满足您的需求。(-o
是为--only-matching
)。
小智 5
您也可以只将grep传递给自身:)
grep -E 'Failed to add (.*) to database' | grep -Eo "[^ ]+@[^ ]+"
Run Code Online (Sandbox Code Playgroud)
或者,如果“感兴趣的行”是唯一包含电子邮件的行,则仅使用最后一个grep命令而不使用第一个。