(P9)Linux最佳入门第9讲:grep命令与正则表达式
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1.grep命令
- 2.正则表达式
- 3.grep中使用正则表达式
- 4.vi中使用正则表达式
1.grep命令
- grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写
- grep命令可以在它的输入中搜索指定的字符串模式Pattern。grep命令的输出是包含输入中指定的字符串模式的行
- grep命令的一般格式为:
grep [option] pattern file
2.正则表达式
- 何为正则表达式?
描述具有某种特征的字符串的表达式 - 正则表达式由普通字符与特殊字符(元字符)构成
- 基本元字符集
- 扩展元字符集
3.grep中使用正则表达式
以public开头的行
[root@host131 ~]# grep ^pubic t1.txt
[root@host131 ~]# grep -n ^pubic t1.txt
以public结尾的行,带上行号
[root@host131 ~]# grep -n pubic$ t1.txt
空行
[root@host131 ~]# grep -n ^$ t1.txt
[root@host131 ~]# grep -n \<public t1.txt 结果不对
[root@host131 ~]# grep -n '\<public' t1.txt 正确
解释如下:为啥第一个命令不行?
因为表达式<public在送给grep之前会送给shell进行处理,对于shell来说\表示转义,<被其转义为<,所以正真送给grep命令的是
<grep,所以搜索的是<public的文本在哪一行。
所以可以加上’ '或者“ ” (单引号和双引号能抑制shell的解析,但是双引号不能抑制\和$),表示shell不会理会转义字符\的特殊含义,会将其当作普
通的字符,不会对其扩展,则\<public会提交给grep命令,
所以\<就看成是单词的开头
[root@host131 ~]#grep -n ^.$ t1.txt
[root@host131 ~]#grep -n 11[^MNX] t1.txt
- eg3:查找一个斜杠
注意单引号和双引号的区别
双引号和单引号的区别是:双引号只能阻止部分的特殊字符,eg:(),[ ],{ }。它不能够阻止shell对\的解释,将2个\解析成1个\给grep,不满足要求,所以需要四个\,所以会送给grep两个
单引号里面不管是什么字符,都会当成普通的字符,双引号不能够抑制shell对\,$的解析。
对于$而言,用" "括起来,shell依然会对其进行解析,不会把它当作普通的字符
[root@host131 ~]#grep -n '\\' t1.txt
[root@host131 ~]#grep -n "\\\\" t1.txt
[root@host131 ~]#grep -n go*d t1.txt
[root@host131 ~]# grep -ni public t1.txt
[root@host131 ~]# grep -En go+d t1.txt
[root@host131 ~]# grep -En 10{3} t1.txt
- eg8:
因为大括号对于shell来讲有可能是特殊的字符,shell会对其解析,阻止shell对{ }的解析,可以用下面的3种方法 - eg9:
因为|在shell中有特殊的含义,为管道,这里要阻止管道特殊的含义,对其抑制,所以加上单引号
[root@host131 ~]# grep -En '11A|B' t1.txt
- eg10
把works当作一个项;
括号也是特殊的字符,shell会把其当作特殊的字符来解析,所以需要抑制
grep -E等于egrep
[root@host131 ~]# grep -En net\(works\)* t1.txt
[root@host131 ~]# grep -En 'net(works)*' t1.txt
[root@host131 ~]# grep -n test t1.test
查询多个文件,可以使用通配符*
[root@host131 ~]# grep public *.txt
反向匹配
[root@host131 ~]# ps aux|grep "ssh"|grep -v grep
递归搜索目录中的所有文件:-r
包含telnet的文件,并列出所在的行
[root@host131 ~]# grep -rn telnet /etc
grep 的-l选项哪些文件包含了test,若有文件多次包含test,则该文件也只会列出一次
[root@host131 ~]# grep -ln test *.txt
4.vi中使用正则表达式
s表示替换,s/XX/YY/,将XX模式替换成YY模式
1,$表示整个文件,g表示一行当中有多次出现,则全部替换掉
在当前行中删除从aa到zz的所有字符
:s/aa.*zz//
在整个文件中用and替换所有的&字符
:1,$s/&/and/g
在每一行的行首插入字符串new,即:将行首替换成new
:1,$s/^/new/g
在第2行到第5行的行尾插入字符串@@
:2,5s/$/@@/g
去掉行首的所有数字字符
:s/^[0-9][0-9]*//
foo(10,7,2) ——>替换成 foo(7,10,2)
foo(bar(8),x+y+z,5) ——>替换成 foo(x+y+z,bar(8),5)
:1,$s/foo(\([^,]*\),\([^,]*\),\([^,]*\))/foo(\2,\1,\3)/g
[^,] 除了逗号之外的任何字符
[^,]* 0或者多个非逗号字符
\([^,]*\) 将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用他
\([^,]*\), 我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用