Linux 《正则表达式基础入门》实验报告

WechatIMG1520.jpeg

grep命令与正则表达式

  • 模拟数据
男,万依柔,scq@chello.nl
男,郜星驰,gvylnyv@yahoo.de
男,牧诗桃,chdrtf@yahoo.es
男,段白卉,jsdhkp@facebook.com
男,姜晓曼,nfabvxz@hotmail.com
男,养刚,sah@charter.net
女,佟从蕾,szz@yaho12o.co.jp
男,後采珊,xviaawcb@hotmail.it
女,羊舌山,fxwrq@hetnet.nl
女,莫安和,gdmko@x.cn
女,慕博跃,klrt@ask.com

创建 user.txt,内容如上

正则表达式特殊符号 说明
[:alnum:] 代表英文大小写字母及数字
[:alpha:] 代表英文大小写字母
[:blank:] 代表空格和 tab 键
[:cntrl:] 键盘上的控制按键,如 CR,LF,TAB,DEL
[:digit:] 代表数字
[:graph:] 代表空白字符以外的其他
[:lower:] 小写字母
[:print:] 可以被打印出来的任何字符
[:punct:] 代表标点符号
[:upper:] 代表大写字母
[:space:] 任何会产生空白的字符如空格,tab,CR 等
[:xdigit:] 代表16进位的数字类型
  • 查找邮箱中含有数字的用户
$ grep -n '[[:digit:]]' user.txt
8:女,佟从蕾,szz@yaho12o.co.jp
grep常用参数 说明
-a 以 text 档案的方式搜寻 binary(二进制) 档案数据
-c 计算找到 '搜寻字符串' 的次数
-i 忽略大小写的不同,所以大小写视为相同
-n 顺便输出行号
-v 反向选择,亦即显示没有 '搜寻字符串' 内容的行
  • 统计性别是的用户个数
$ grep -c '男' user.txt
7
  • 查找性别是的用户
$ grep -n '女' user.txt
7:女,佟从蕾,szz@yaho12o.co.jp
9:女,羊舌山,fxwrq@hetnet.nl
10:女,莫安和,gdmko@x.cn
11:女,慕博跃,klrt@ask.com
  • 查找性别不是的用户
$ grep -vn '女' user.txt
1:男,万依柔,scq@chello.nl
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
4:男,段白卉,jsdhkp@facebook.com
5:男,姜晓曼,nfabvxz@hotmail.com
6:男,养刚,sah@charter.net
8:男,後采珊,xviaawcb@hotmail.it
字符组匹配 说明
[abc] 表示 “a” 或 “b” 或 “c”
[0-9] 表示 0~9 中任意一个数字,等价于 [0123456789]
[\u4e00-\u9fa5] 表示任意一个汉字
[^a1<] 表示除 “a”、“1”、“<” 外的其它任意一个字符
[^a-z] 表示除小写字母外的任意一个字符
  • 查找姓氏中含有万、段的用户
$ grep -n '[万段]' user.txt
1:男,万依柔,scq@chello.nl
4:男,段白卉,jsdhkp@facebook.com
  • 查找邮箱中含有.net的用户
$ grep -n '[.]net' user.txt
6:男,养刚,sah@charter.net
  • 查找邮箱中不含有.com的用户
$ grep -vn '[.]com' user.txt
1:男,万依柔,scq@chello.nl
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
6:男,养刚,sah@charter.net
7:女,佟从蕾,szz@yaho12o.co.jp
8:男,後采珊,xviaawcb@hotmail.it
9:女,羊舌山,fxwrq@hetnet.nl
10:女,莫安和,gdmko@x.cn
行首符与行尾符 说明
^$ 过滤掉空白行
^# 过滤掉注释行(以 # 号开头)
  • 查找邮箱后缀是.cn的用户
$ grep -n '.cn$' user.txt
10:女,莫安和,gdmko@x.cn
  • 统计性别是的用户个数
$ grep -c '^女' user.txt
4
  • 统计所有用户个数
$ grep -vc '^$' user.txt
11
单个/重复字符 说明
*(星号) 代表重复前面 0 个或者多个字符。
e* 表示具有空字符或者一个以上 e 字符。
ee* 表示前面的第一个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
eee* 表示前面两个 e 字符必须存在。第三个 e 则可以是 0 个或者多个 e 字符。
ee*e 表示前面的第一个与第三个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
  • 查找姓名是万X柔的用户
$ grep -n '万.柔' user.txt
1:男,万依柔,scq@chello.nl
  • 查找邮箱中含有oo的用户
$ grep -n 'ooo*' user.txt
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
4:男,段白卉,jsdhkp@facebook.com
限定连续字符范围 说明
{} 限制一个范围区间内的重复字符数
  • 查找邮箱中符合yah后面接oo,然后再接.的用户:
$ grep -n 'yaho\{2\}.' user.txt
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
  • 查找邮箱中符合h后面接一到两个o的用户
$ grep -n 'ho\{1,2\}' user.txt
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
5:男,姜晓曼,nfabvxz@hotmail.com
7:女,佟从蕾,szz@yaho12o.co.jp
8:男,後采珊,xviaawcb@hotmail.it
总结 说明
^word 表示待搜寻的字符串word在行首
word$ 表示待搜寻的字符串word在行尾
. 小数点,表示 1 个任意字符
\ 表示转义字符,在特殊字符前加 \ 会将特殊字符意义去除
* 表示重复 0 到无穷多个前一个 RE(正则表达式)字符
[list] 表示搜索含有 l,i,s,t 任意字符的字符串
[n1-n2] 表示搜索指定的字符串范围,例如 [0-9] [a-z] [A-Z] 等
[^list] 表示反向字符串的范围,例如 [^0-9] 表示非数字字符,[^A-Z] 表示非大写字符范围
\{n,m\} 表示找出 n 到 m 个前一个 RE 字符
\{n,\} 表示 n 个以上的前一个 RE 字符

sed命令与正则表达式

  • 显示第6行之后的用户
$ nl user.txt | sed '1,6d'
     7  女,佟从蕾,szz@yaho12o.co.jp
     8  男,後采珊,xviaawcb@hotmail.it
     9  女,羊舌山,fxwrq@hetnet.nl
    10  女,莫安和,gdmko@x.cn
    11  女,慕博跃,klrt@ask.com
  • 显示第7行之前的用户
$ nl user.txt | sed '7,$d'
     1  男,万依柔,scq@chello.nl
     2  男,郜星驰,gvylnyv@yahoo.de
     3  男,牧诗桃,chdrtf@yahoo.es
     4  男,段白卉,jsdhkp@facebook.com
     5  男,姜晓曼,nfabvxz@hotmail.com
     6  男,养刚,sah@charter.net
  • 在原文件中删除第11行的用户
$ sed -i '11d' user.txt

如果要修改原文件,需要添加-i选项。

  • 在第11行后添加用户小白
$ nl user.txt | sed '11a 男,小白,xiaobai@qq.com'
     1  男,万依柔,scq@chello.nl
     2  男,郜星驰,gvylnyv@yahoo.de
     3  男,牧诗桃,chdrtf@yahoo.es
     4  男,段白卉,jsdhkp@facebook.com
     5  男,姜晓曼,nfabvxz@hotmail.com
     6  男,养刚,sah@charter.net
     7  女,佟从蕾,szz@yaho12o.co.jp
     8  男,後采珊,xviaawcb@hotmail.it
     9  女,羊舌山,fxwrq@hetnet.nl
    10  女,莫安和,gdmko@x.cn
    11  女,慕博跃,klrt@ask.com
男,小白,xiaobai@qq.com
  • 在第1行前添加用户小蓝
$ nl user.txt | sed '1i 男,小蓝,xiaolan@qq.com'
男,小蓝,xiaolan@qq.com
     1  男,万依柔,scq@chello.nl
     2  男,郜星驰,gvylnyv@yahoo.de
     3  男,牧诗桃,chdrtf@yahoo.es
     4  男,段白卉,jsdhkp@facebook.com
     5  男,姜晓曼,nfabvxz@hotmail.com
     6  男,养刚,sah@charter.net
     7  女,佟从蕾,szz@yaho12o.co.jp
     8  男,後采珊,xviaawcb@hotmail.it
     9  女,羊舌山,fxwrq@hetnet.nl
    10  女,莫安和,gdmko@x.cn
    11  女,慕博跃,klrt@ask.com
  • 将第11行的替换为女,小康,xiaokang@qq.com
$ nl user.txt | sed '11c 女,小康,xiaokang@qq.com'
     1  男,万依柔,scq@chello.nl
     2  男,郜星驰,gvylnyv@yahoo.de
     3  男,牧诗桃,chdrtf@yahoo.es
     4  男,段白卉,jsdhkp@facebook.com
     5  男,姜晓曼,nfabvxz@hotmail.com
     6  男,养刚,sah@charter.net
     7  女,佟从蕾,szz@yaho12o.co.jp
     8  男,後采珊,xviaawcb@hotmail.it
     9  女,羊舌山,fxwrq@hetnet.nl
    10  女,莫安和,gdmko@x.cn
女,小康,xiaokang@qq.com
  • 输出指定2-5行的用户
$ nl user.txt |sed -n '5,7p'
     5  男,姜晓曼,nfabvxz@hotmail.com
     6  男,养刚,sah@charter.net
     7  女,佟从蕾,szz@yaho12o.co.jp
  • 邮箱带有yahoo的替换为hotmail
$ cat user.txt | grep 'yahoo' | sed 's/yahoo/hotmail/g'
男,郜星驰,gvylnyv@hotmail.de
男,牧诗桃,chdrtf@hotmail.es

扩展正则表达式egrep

  • 去除空白行并查找性别是男的用户
$ grep -v '^$' user.txt | grep -v '^女'
# 等同
$ egrep -v '^$|^女' user.txt
男,万依柔,scq@chello.nl
男,郜星驰,gvylnyv@yahoo.de
男,牧诗桃,chdrtf@yahoo.es
男,段白卉,jsdhkp@facebook.com
男,姜晓曼,nfabvxz@hotmail.com
男,养刚,sah@charter.net
男,後采珊,xviaawcb@hotmail.it
扩展规则 说明
+ 表示重复一个或一个以上的前一个字符
? 表示重复零个或一个的前一个字符
表示用或(or)的方式找出数个字符串
() 表示找出组字符串
()+ 表示多个重复群组判别
  • 查找邮箱中符合h后面接一到两个o的用户
$ egrep -n 'ho+' user.txt
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
5:男,姜晓曼,nfabvxz@hotmail.com
7:女,佟从蕾,szz@yaho12o.co.jp
8:男,後采珊,xviaawcb@hotmail.it
  • 查找邮箱中重复零个或一个o的用户
$ egrep -n 'ho?' user.txt
1:男,万依柔,scq@chello.nl
2:男,郜星驰,gvylnyv@yahoo.de
3:男,牧诗桃,chdrtf@yahoo.es
4:男,段白卉,jsdhkp@facebook.com
5:男,姜晓曼,nfabvxz@hotmail.com
6:男,养刚,sah@charter.net
7:女,佟从蕾,szz@yaho12o.co.jp
8:男,後采珊,xviaawcb@hotmail.it
9:女,羊舌山,fxwrq@hetnet.nl
  • 查找邮箱中含有.com.cn的用户
$ egrep -n '.com|.cn' user.txt
4:男,段白卉,jsdhkp@facebook.com
5:男,姜晓曼,nfabvxz@hotmail.com
10:女,莫安和,gdmko@x.cn
11:女,慕博跃,klrt@ask.com
  • 查找邮箱中含有hothet的用户
$ egrep -n 'h(o|e)t' user.txt
5:男,姜晓曼,nfabvxz@hotmail.com
8:男,後采珊,xviaawcb@hotmail.it
9:女,羊舌山,fxwrq@hetnet.nl
  • 查找邮箱中含有以.nl结尾,并且含有一个以上的et字符串
$ egrep -n '(et)+.nl' user.txt
9:女,羊舌山,fxwrq@hetnet.nl

常用总结

  • 匹配两个字符串之间的所有字符
# 格式
\开始字符.*? \结尾字符
# 例如
Christ is my god
# 匹配"Christ is"和"god"之间的每个字符
\Christ is.*? \god
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,858评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,372评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,282评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,842评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,857评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,679评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,406评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,311评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,767评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,090评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,785评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,420评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,988评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,101评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,298评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,033评论 2 355