使用grep cmd进行过滤

时间:2016-09-06 17:07:12

标签: linux unix grep

使用grep或egrep

有多少个电子邮件地址采用'first.last'名称格式且涉及到某人 谁的名字以字母表前半部分的字母开头? (我想得到点数)

testfile.txt的摘录

my-command XXX    # to display the result  
echo "Number :" $(my-command XXX | wc -l)    # to display the number of lines

要做到这一点,我想过滤每一行以检查它是否有" @"检查第一个字母是否是A-M或a-m,并检查它是否有句号。

glorious@uole.com hhhhhh ItzStatic jackass The_Epic_Turtle david.webb@cia.gov overthemoon34 smiley362 emilio rico@uole.com ddc44ever check.it@geocities.com dickens@uole.com middle614 IntegrityJeff 5432 jdm-mojo@geocities.com zack.gertrude@gmail.com

grep -c "@" testingfile.txt(虽然这只检查行中是否有1次出现。)

grep -c "\." testingfile.txt(仍然无法让这个工作)

如何将3个语句组合在一起,如何检查每行的第一个字符是否是a-m或A-M之间的字母?

2 个答案:

答案 0 :(得分:1)

查找以[a-mA-Z]

开头的电子邮件地址

因为你对一行上有多个电子邮件的问题感兴趣,让我们考虑一下这个测试文件:

$ cat testingfile.txt 
glorious@uole.com
hhhhhh
david.webb@cia.gov overthemoon34 rico@uole.com
Check.it@geocities.com dickens@uole.com
IntegrityJeff
5432
jdm-mojo@geocities.com
zack.gertrude@gmail.com

这显示了所有匹配电子邮件地址的第一部分,其首字母位于字母表的前半部分:

$ grep -o "\b[a-mA-M][^[:blank:]]*@" testingfile.txt 
glorious@
david.webb@
Check.it@
dickens@
jdm-mojo@
gertrude@

这算了他们:

$ grep -o "\b[a-mA-M][^[:blank:]]*@" testingfile.txt | wc -l
6

对“第一”名称更加严格

如果我们想将匹配限制为名称部分包含句点的电子邮件地址:

$ grep -o "\b[a-mA-M][^[:blank:]]*\.[^[:blank:]]*@" testingfile.txt 
david.webb@
Check.it@

并计算他们:

$ grep -o "\b[a-mA-M][^[:blank:]]*\.[^[:blank:]]*@" testingfile.txt | wc -l
2

注释

  1. 此处使用的正则表达式\b[a-mA-M][^[:blank:]]*@非常简单。存在准确选择真实电子邮件地址的正则表达式,但它们非常复杂。

  2. grep -c计算行数。我们首先必须使用grep -o将每个匹配放在一个单独的行上,然后使用wc -l计算行数。

  3. 正则表达式[a-mA-M]不是unicode-safe。

答案 1 :(得分:0)

您可以使用:

 grep "^[a-mA-M].*\..*@" testingfile.txt

这将搜索一个以字母表的前半部分开始的字符串(^[a-mA-M].*)然后,在某个时刻包含一个句点(.*\.),然后在某个时刻后面会有{ {1}} :( @)。