文章目录

  • 一 grep常用参数
  • 1)-v 取反
  • 2)-n 显示行号
  • 3)-i 不区分大小写
  • 4)-l 只输出匹配到内容的文件名
  • 5) -c 匹配该内容总共出现的行的数目
  • 6)-o 和 -w 的区别
  • 二 部分测试环境
  • 三 基础正则符号
  • 1)点符号`.`
  • 2)星符号`*`
  • 3)点和星结合 `.*`
  • 4)转义符号`\`
  • 5)中括号 `[ ]`
  • 6)排除符号 `[^ ]`
  • 四 扩展正则符号
  • 1)加号`+`
  • 2)竖线符号 `|`
  • 3)小括号 `( )`
  • 4)大括号`{ }`
  • 5)问号 `?`


一 grep常用参数

参数

作用

-v

结果取反

-n

显示行号

-i

不区分大小写

-l

只输出文件名

-c

统计出现的行的数目

-o

只显示匹配部分的内容

-w

只显示全匹配内容的整行内容

1)-v 取反

匹配文件内所有的空行grep "^$" test.txt 忽略文件内所有的空行 grep -v "^$" test,txt ^和$分别表示开头和结尾,中间为空,连起来就是匹配空行。

2)-n 显示行号

[root@db01 scripts]# grep -n 200 test.txt 
4:200	Tarija	  BOL	        Tarija	        125255
7:2000	Changzhi  CHN	        Shanxi	        317144

3)-i 不区分大小写

该字母的大小写都会被匹配到

4)-l 只输出匹配到内容的文件名

(此处是L字母的小写l)
例如,匹配 /tmp 目录下,所有含oldboy信息的文件 grep -l "oldboy" /tmp

5) -c 匹配该内容总共出现的行的数目

假如匹配oldboy,某一行中,oldboy出现了3次,但最后统计,这个只算1行。

6)-o 和 -w 的区别

以匹配Linux的IP地址为例。
使用ifconfig命令再通过inet就可以找到该行中存在的IP。

[root@server ~]# ifconfig|grep  inet
        inet 10.0.0.11  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fef1:4a52  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

使用-o只会显示参数后的内容,其他什么都没有。

[root@server ~]# ifconfig|grep -o inet
inet
inet
inet
inet
inet

使用-w会匹配到这串完整字符的所有行的内容,不多匹配,也不少匹配

[root@server ~]# ifconfig|grep -w inet
        inet 10.0.0.11  netmask 255.255.255.0  broadcast 10.0.0.255
        inet 127.0.0.1  netmask 255.0.0.0
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

二 部分测试环境

[root@db01 scripts]# cat test.txt 

ID	  Name	  CountryCode	District	Population
50	  Tiaret	  DZA	    Tiaret	    100118.
100	  Paraná	  ARG	    Entre Rios	207041
200	  Tarija	  BOL	    Tarija	    125255
500	  Bolton	  GBR	    England	    139020.
1000  Taman	      IDN	    East Java	107000
2000  Changzhi    CHN	    Shanxi	    317144
oldboy
oldbey
oldboey

三 基础正则符号

1)点符号.

匹配任意一个且只有一个字符

2)星符号*

匹配前一个字符连续出现了0次或者多次
匹配B字符 grep "B*" test.txt

3)点和星结合 .*

匹配任意所有字符
匹配“England"字符 grep "E.*d" test.txt

4)转义符号\

使得有特殊意义和普通意义的符号间可以相互转换

##\n换行符
[root@db01 scripts]# echo -e "hello\nworld"
hello
world

过滤每行的最后一个字符 grep ".$" test.txt 过滤一行中最后一个是点符号的行 grep "\.$" test.txt

ps.双引号、单引号、反引号的区别
单引号'' 所见即所得,直接输出内部字符串,不会对特殊字符解析
双引号""会解析特殊字符;若忽略特殊字符仅输出,则在前面加上反斜杠\即可
反引号 内含字符串命令,会先执行该命令

5)中括号 [ ]

匹配多个字符

##匹配oldboy和oldbey
[root@db01 scripts]# grep "oldb[oe]y" test.txt 
oldboy
oldbey

找到1和2开头的行

[root@db01 scripts]# grep "^[12]" test.txt 
100	Paraná	  ARG	        Entre Rios	207041
200	Tarija	  BOL	        Tarija	        125255
1000	Taman	  IDN	        East Java	107000
2000	Changzhi  CHN	        Shanxi	        317144

6)排除符号 [^ ]

排除o和e,其他都匹配上。grep "[^oe]" test.txt

四 扩展正则符号

grep和sed不能直接识别,需要添加参数才能识别。
grep -E 或 egrep
sed -r

1)加号+

匹配前一个字符连续出现了1次或者多次
匹配出现的所有数字0 egrep "0+" test.txt

2)竖线符号 |

用于匹配多个信息

##匹配oldboy和oldbey
[root@db01 scripts]# grep -E "oldboy|oldbey" test.txt 
oldboy
oldbey

3)小括号 ( )

作用一:指定信息的整体匹配

[root@db01 scripts]# grep -E "oldb(oe)y" test.txt 
oldboey
[root@db01 scripts]# grep -E "oldb(o|e)y" test.txt 
oldboy
oldbey
[root@db01 scripts]# grep -E "oldb[oe]y" test.txt 
oldboy
oldbey

作用二:在sed命令中后项引用前项,此处举例简单说明。

要求:批量创建user01 user02 … user10 一共10 个用户。

echo user{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash

echo user{01…10} 批量创建10个用户

|xargs -n1 用管道命令把输出结果表示成一列,并作为后续sed命令的输入结果

sed -r ‘s#(.*)#useradd \1#g’

参数 -r 识别扩展正则符号;
(.*)  表示前面得到的所有输出内容,包括user01..user10
\1 表示引用了前面的(.*),即后项引用前项,二者内容完全一样
|bash 表示将最后的语句调用shell,变成可执行的linux命令
在 sed -r s#A#B#g 的格式下,把A替换成B,此处同理
把user01 换成了 useradd user01,再调用bash,变成命令,创建用户user01。以此类推。

此外,后向引用前项中的”前项“和”后项“可以有多个元素

##将一串元素引用
[root@db01 scripts]# echo 123456|sed -r 's#([1-6]+)#<\1>#g'
<123456>
[root@db01 scripts]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>

也可以”一变多“

[root@db01 scripts]# echo 123456|sed -r "s#(12)(34)(56)#<\1><\2><\3>#g"
<12><34><56>
[root@db01 scripts]# echo 123456|sed -r "s#(12)(34)(56)#<\2><\3><\1>#g"
<34><56><12>
[root@db01 scripts]# echo 123456|sed -r "s#(..)(..)(..)#<\3><\2><\1>#g"
<56><34><12>

4)大括号{ }

指定字符连续匹配的次数

a{m,n}表示字符a至少连续出现m次,最多出现n次

准备测试环境

[root@canway01 tmp]# cat test.txt 
k
kk
kabckabck
kkabc
kkkabckabc
kkabckkkkk

要求:找到k至少连续出现2次,最多连续出现4次的行

[root@canway01 tmp]# egrep 'k{2,4}' test.txt 
kk
kkabc
kkkabckabc
kkabckkkkk

如果不使用识别扩展正则符号的参数egrepgrep -E 也可以用转义符,识别大括号

[root@canway01 tmp]# grep 'k\{2,4\}' test.txt 
kk
kkabc
kkkabckabc
kkabckkkkk

5)问号

定义匹配前一个字符出现0或者1次

[root@canway01 tmp]# cat test.txt 
oldboy
oldboey
oldbey
oldy
oldby
oldbby
oldbbby
[root@canway01 tmp]# egrep "ldb?y" test.txt 
oldy
oldby