文章目录

  • ​​1.grep命令​​
  • ​​2.正则表达式​​
  • ​​3.grep中使用正则表达式​​
  • ​​4.vi中使用正则表达式​​

1.grep命令

  • grep是通用正则表达式分析程序(General Regular Expression Parser)的缩写
  • grep命令可以在它的输入中搜索指定的字符串模式Pattern。grep命令的输出是包含输入中指定的字符串模式的行
  • grep命令的一般格式为:
grep [option] pattern file
  • grep命令常用开关

2.正则表达式

  • 何为正则表达式?
    描述具有某种特征的字符串的表达式
  • 正则表达式由普通字符与特殊字符(元字符)构成
  • 基本元字符集
  • 扩展元字符集

3.grep中使用正则表达式

  • eg1
以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

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号

  • eg2:查找以public单词开头的行
[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命令,
所以\<就看成是单词的开头

(P9)Linux最佳入门第9讲:grep命令与正则表达式_正则表达式_02

  • eg2:只包含一个字符的行
[root@host131 ~]#grep -n ^.$ t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_字符串_03

  • eg2:匹配不在里面的某个字符
[root@host131 ~]#grep -n 11[^MNX] t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_字符串_04

  • eg3:查找一个斜杠
    注意单引号和双引号的区别
    双引号和单引号的区别是:双引号只能阻止部分的特殊字符,eg:(),[ ],{ }。它不能够阻止shell对\的解释,将2个\解析成1个\给grep,不满足要求,所以需要四个\,所以会送给grep两个
    单引号里面不管是什么字符,都会当成普通的字符,双引号不能够抑制shell对\,$的解析。
    对于$而言,用" "括起来,shell依然会对其进行解析,不会把它当作普通的字符
[root@host131 ~]#grep -n '\\' t1.txt
[root@host131 ~]#grep -n "\\\\" t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号_05

  • eg4
[root@host131 ~]#grep -n go*d t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号_06

  • eg5
    grep -i不区分大小写
[root@host131 ~]# grep -ni public t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号_07

  • eg6:
[root@host131 ~]# grep -En go+d t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号_08

  • eg7:
    匹配的是1000,后面的不会去匹配
[root@host131 ~]# grep -En 10{3} t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_正则表达式_09

  • eg8:
    因为大括号对于shell来讲有可能是特殊的字符,shell会对其解析,阻止shell对{ }的解析,可以用下面的3种方法
  • eg9:
    因为|在shell中有特殊的含义,为管道,这里要阻止管道特殊的含义,对其抑制,所以加上单引号
[root@host131 ~]# grep -En '11A|B' t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_双引号_10

  • eg10
    把works当作一个项;
    括号也是特殊的字符,shell会把其当作特殊的字符来解析,所以需要抑制
    grep -E等于egrep
[root@host131 ~]# grep -En net\(works\)* t1.txt

[root@host131 ~]# grep -En 'net(works)*' t1.txt

(P9)Linux最佳入门第9讲:grep命令与正则表达式_字符串_11

  • eg11
    查找包含test的文件当中的所在行
[root@host131 ~]# grep -n test t1.test
  • eg12
查询多个文件,可以使用通配符*
[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

(P9)Linux最佳入门第9讲:grep命令与正则表达式_字符串_12

4.vi中使用正则表达式

  • eg1
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]*//
  • eg2
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或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用