首页 > 技术文章 > linux三剑客---grep,sed,awk与正则表达式

xqr2018 2018-04-21 17:36 原文

grep命令:

grep全称:Global Regular Expression Print,即全面搜索正则表达式并把行打印出来,通过参数-E可以使用egrep的功能

grep与egrep的区别:在于grep只支持基础正则表达式,而egrep可以支持扩展的正则表达式

 

常用用法:

[root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

高级参数:

-A:后面加数字,为after的意思,除了列出该行外,后续的n行也列出来
-B:后面加数字,为befer的意思,除了列出该行外,前面的n行也列出来
--color=auto:可将正确的那个选取数据列出颜色

例:[root@learning tmp]# grep -A2 -B2 "this" regular_express.txt
apple is my favorite foody
Football agame is not use feet only
this dress doesn't fit me.
go!go!let's go!!!
42500000491

 

sed命令:流编辑器,可以实现对文件的增删改查和替换

文件person.txt:
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

1.-n:取消默认输出
p:打印
[root@learning test]# sed -n "2"p person.txt     
102,zhangyao,CTO
【引号里面表示第几行,也可以是一个范围】

2.a:追加文本到指定行后(文件本身是没有修改的,数据不变,追加的只是显示出来的东西 )
i:追加文本到指定行前
[root@learning test]# sed "2a 106,dandan,CSO" person.txt 
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

3.d:删除行
[root@learning test]# sed "1d" person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

4.c:用新行取代旧行

[root@learning test]# sed "3c 106,dandan,CSO" person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
104,yy,CFO
105,feixue,CIO

 

5.s:将每一行中第一处匹配的字符进行替换

 g:每一行进行全部替换==>sed命令s的替换标志之一,非sed命令

-i:修改文件内容

s#*#-#g:把*全部转换为-,*可以是正则表达式,-不可以

[root@learning test]# sed "s#o#**#g" person.txt
101,**ldb**y,CEO
102,zhangya**,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@learning test]# sed "s#o#*" person.txt
sed: -e expression #1, char 5: unterminated `s' command
[root@learning test]# sed "s#o#*#" person.txt
101,*ldboy,CEO
102,zhangya*,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

 

正则表达式:

简单来说,正则表达式就是处理字符串的方法,以行为单位来进行字符串的处理行为;正则表达式通过一些特殊符号的辅助,让用户可以轻易达到查找,删除,替换某特定字符串的处理程序

^word 搜索以word为行首的那一行
word$ 搜索以word为行尾的一行
.

代表且只能代表任意一个字符

\

转义符号
* 表示重复0个或多个前面的字符(linux其他地方表示所有,例*.php,表示所有后缀名为php的文件)
.*

匹配所有字符

^.*

以任意字符开头的内容

[word] 匹配word中任意一个字符存在的行
[^word]

匹配不包含^后任意字符的所有内容

\{n,m\} 匹配前一个字符重复次数n到m次的前一行【\为转义符号,如果用egrep可以去掉斜线】
\{n,\} 匹配前一个字符重复次数至少n次的前一行
\{n\} 匹配前一个字符重复次数为n次的那一行

 

例1:
[root@learning tmp]# grep "^th" regular_express.txt
this dress doesn't fit me.

例2:
[root@learning tmp]# grep "y$" regular_express.txt
"open source" is a good mechanism to devolop programsy
apple is my favorite foody

例3:

[root@learning tmp]# grep "425.0" regular_express.txt
  42500000491
  425000491

例4:

[root@learning tmp]# grep "\." regular_express.txt
this dress doesn't fit me.【如果只是“.”,将会匹配全部】

例5:

[root@learning tmp]# grep "4250*49" regular_express.txt
42500000491
425491
425000491

例6:

[root@learning tmp]# grep [aeo] regular_express.txt
"open source" is a good mechanism to devolop programsy
apple is my favorite foody
Football agame is not use feet only
this dress doesn't fit me.
go!go!let's go!!!

例7:
[root@learning tmp]# grep '0\{3,\}' regular_express.txt
42500000491
425000491

 

 

扩展的正则表达式

+

表示重复一个或多个前面的字符

0个或1个字符
|

用或的方式查找多个符合的字符串

() 找出”组”字符串(例如找出glad或glod两个字符串,grep 'g(la|lo)d' regular_express
()+ d多个重复组的判别

推荐阅读