linux - 使用grep命令过滤

标签 linux unix grep

使用 grep 或 egrep

有多少电子邮件地址采用“名.姓”格式并涉及某人 谁的名字以字母表前半部分的字母开头? (我想得到计数)

testingfile.txt 的摘录

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

为此,我想过滤每一行以检查它是否有“@”并检查第一个字母以查看它是 A-M 还是 a-m,并检查它是否有句点。

grep -c "@"testingfile.txt

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

grep -c "[a-mA-M]"testingfile.txt(仍然没有让这个工作)

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

最佳答案

查找以 [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 安全的。

关于linux - 使用grep命令过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354393/

相关文章:

c - 如何在LINUX(Ubuntu)上用C实现TCP SO_KEEPALIVE

c++ - IPC linux 中数组存储的段错误

Linux 内核实用函数,以符号字符串作为输入并返回其地址

linux - 命令行 : monitor log file and add data to database

linux - bash 中过去 24 小时的 Grep 时间戳

linux - 在提示符下配置 git 分支

c - 结构中的 "s"是什么意思?

Bash 脚本 if 语句

awk - 根据第一列比较两个文件,打印一个文件的唯一部分

linux - 根据字段和长度删除重复的行