grep文件中的特定模式?

时间:2014-11-19 20:36:32

标签: shell grep

我有一个文件textFile.txt

abc_efg@qwe.asd
abc_aer@
@avret
afd_wer_asd@qweasd.zxcasd
wqe_a@qwea.cae
qwe.caer

我想grep获取具体的行:

abc_efg@qwe.asd
afd_wer_asd@qweasd.zxcasd
wqe_a@qwea.cae

那是

[a-z]_[a-z]@[a-z].[a-z]

@之前的部分可以包含任意数量的“_”

到目前为止,这就是我所拥有的:

grep "[a-z]_[a-z]@[a-z].[a-z]" textFile.txt

但我只得到一行作为输出。

wqe_a@qwea.cae

我可以知道更好的方法吗? :)

5 个答案:

答案 0 :(得分:1)

您可以在_内添加[a-z_],以便新命令为:

grep "[a-z_]@[a-z].[a-z]" textFile.txt

或者如果您希望以非_开头,则可以

grep "[a-z][a-z_]@[a-z].[a-z]" textFile.txt

答案 1 :(得分:0)

以下内容选择至少有一个下划线字符后跟字母后面的字母和一个或多个字母后面至少有一个文字句点的行:

$ grep '_[a-z]\+@[a-z]\+\.' textFile.txt
abc_efg@qwe.asd
afd_wer_asd@qweasd.zxcasd
wqe_a@qwea.cae

注释

  • 未转义的句点与任何字符匹配。如果要匹配文字句点,则必须将其转义为“。”。

    因此,@[a-z].[a-z]匹配at符号,后跟一个字母,后跟任何内容,后跟一个字母。

  • [a-z]匹配一个字母。因此_[a-z]@只有在下划线和at符号之间只有一个字符时才会匹配。要匹配一个或多个字母,请使用[a-z]\+

    @[a-z]\+\.将匹配一个at符号,后跟一个或多个字母,后跟一个文字句点字符。

答案 2 :(得分:0)

我建议通过检查每行中只有一个@来保持简单:

grep -E '^[^@]+@[^@]+$' file
abc_efg@qwe.asd
afd_wer_asd@qweasd.zxcasd
wqe_a@qwea.cae

答案 3 :(得分:0)

执行[a-z]时,它只匹配该组中的一个字符。这就是为什么你只是从grep通话中回复wqe_a@qwea.cae的原因,因为_@之间只有一个字符。

要匹配多个字符,您可以使用+*+表示集合中的一个或多个*任意数量的集合。同样,未转义的.表示任何角色。

类似于:

grep "[a-z]\+_[a-z]\+@[a-z]\+\.[a-z]\+" textFile.txt可以为此工作。还有更短,更不具体的方法(其他答案已经显示)。

请注意+符号和.之前的转义符。

答案 4 :(得分:0)

regex应从文本文件中获取所有有效的电子邮件:

grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file
abc_efg@qwe.asd
afd_wer_asd@qweasd.zxcasd
wqe_a@qwea.cae

这样的格式就像这个text@text.some_more_text