你能用正则表达式grep一个文件,只输出一行的匹配部分吗?

Oll*_*lly 13 unix shell grep

我有一个包含许多错误行的日志文件,例如:

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)


Nat*_*man 6

你可以使用sed:

grep -E 'Failed to add (.*) to database'| sed 's/'Failed to add \(.*\) to database'/\1'
Run Code Online (Sandbox Code Playgroud)


bor*_*yer 5

最新版本的 GNU grep 有一个-o选项可以完全满足您的需求。(-o是为--only-matching)。

  • 使用 `-o` 将显示与找到匹配的整行的正则表达式匹配的部分。但@Olly 只想要第一个子组(电子邮件地址,没有周围的文字)。 (4认同)

小智 5

您也可以只将grep传递给自身:)

grep -E 'Failed to add (.*) to database' | grep -Eo "[^ ]+@[^ ]+"
Run Code Online (Sandbox Code Playgroud)

或者,如果“感兴趣的行”是唯一包含电子邮件的行,则仅使用最后一个grep命令而不使用第一个。