1.6 linux基础(六)
1.6 linux 基础(六)三剑客之grep
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检 查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...]
-
grep root /etc/passwd
-
grep "$USER" /etc/passwd
-
grep '$USER' /etc/passwd
-
grep `whoami` /etc/passwd
grep命令选项 :
-
--color=auto: 对匹配到的文本着色显示
-
-v: 显示没被pattern匹配到的行
-
-i: 忽略字符大小写
-
-n:显示匹配的行号
-
-c: 统计匹配的行数
-
-o: 仅显示匹配到的字符串
-
-q: 静默模式,不输出任何信息
-
-A #: after, 后#行 (找标志)
-
-B #: before, 前#行
~]# nmap -v -sP 192.168.32.0/24 |grep -B1 up|grep "Nmap scan" |cut -d" " -f5
-
-C #:context, 前后各#行
-
-e:实现多个选项间的逻辑or关系
-
grep –e 'cat ' -e 'dog' file
-
-w:匹配整个单词
-
-E:使用ERE,扩展正则表达式
-
-F:相当于fgrep,不支持正则表达式(查找速度快)
1.6.1 正则表达式
-
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)
-
不表示字符字面意义,而表示控制或通配的功能
-
程序支持:grep,sed,awk,vim, less,nginx,varnish等
-
分两类:
-
基本正则表达式:BRE
-
扩展正则表达式:ERE grep -E, egrep
-
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex
基本正则表达式元字符
1.6.1.1 字符匹配:
-
. 匹配任意单个字符
-
[] 匹配指定范围内的任意单个字符
-
[^] 匹配指定范围外的任意单个字符
-
[:alnum:] 字母和数
-
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
-
[:lower:] 小写字母
-
[:upper:] 大写字母
-
[:digit:] 十进制数字
-
[:punct:] 标点符号
-
[:space:] 水平和垂直的空白字符
-
[:blank:] 空白字符(空格和制表符)
-
[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)
-
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
-
[:xdigit:]十六进制数字
-
[:graph:] 可打印的非空白字符
-
[:print:] 可打印字符
1.6.1.2 匹配次数
-
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
-
*: 匹配前面的字符任意次,包括0次
-
贪婪模式:尽可能长的匹配
-
.* 任意长度的任意字符
-
? 匹配其前面的字符0或1次
-
+ 匹配其前面的字符至少1次
-
{n} 匹配前面的字符n次
-
{m,n} 匹配前面的字符至少m次,至多n次
-
{,n} 匹配前面的字符至多n次
-
{n,} 匹配前面的字符至少n次
-
1.6.1.2 位置锚定:定位出现的位置
- ^ 行首锚定,用于模式的最左侧
- $ 行尾锚定,用于模式的最右侧
- ^PATTERN$ 用于模式匹配整行
- ^$ 空行
- [1]*$ 空白行
- < 或 \b 词首锚定,用于单词模式的左侧
- > 或 \b 词尾锚定;用于单词模式的右侧
- <PATTERN> 匹配整个单词
1.6.1.3 分组:
-
() 将一个或多个字符捆绑在一起,当作一个整体进行处理
-
如: (root)+ 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
-
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例: (string1+(string2)*)
\1 :string1+(string2)*
\2 :string2
1.6.1.4 后向引用
- 引用前面的分组括号中的模式所匹配字符,而非模式本身
[root@centos7 ~]# cat 1.txt
He love his lover.
She like her liker.
He like his lover.
[root@centos7 ~]# cat 1.txt |egrep "(love)+.*\1"
He love his lover.
1.6.1.5 或者:|
- 示例:a|b: a或b
C|cat: C或cat
(C|c)at:Cat或cat
练习:
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
[root@CentOS7 scripts]# cat /proc/meminfo |grep -E "^(s|S)"
SwapCached: 0 kB
SwapTotal: 3145724 kB
SwapFree: 3145724 kB
Shmem: 10640 kB
Slab: 119216 kB
SReclaimable: 59848 kB
SUnreclaim: 59368 kB
[root@CentOS7 scripts]# cat /proc/meminfo |grep "^[sS]"
SwapCached: 0 kB
SwapTotal: 3145724 kB
SwapFree: 3145724 kB
Shmem: 10640 kB
Slab: 119216 kB
SReclaimable: 59848 kB
SUnreclaim: 59368 kB
[root@CentOS7 scripts]# cat /proc/meminfo |grep -i "^s"
SwapCached: 0 kB
SwapTotal: 3145724 kB
SwapFree: 3145724 kB
Shmem: 10640 kB
Slab: 119232 kB
SReclaimable: 59848 kB
SUnreclaim: 59384 kB
2、显示/etc/passwd文件中不以/bin/bash结尾的行
[root@CentOS7 scripts]# cat /etc/passwd |grep -v "/bin/bash$"
3、显示用户rpc默认的shell程序
[root@CentOS7 scripts]# cat /etc/passwd |grep "rpc\>"|cut -d : -f7
/sbin/nologin
4、找出/etc/passwd中的两位或三位数
[root@CentOS7 scripts]# cat /etc/passwd|grep "\<[1-9][0-9]\{1,2\}\>"
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非 空白字符的行
[root@CentOS7 scripts]# cat /etc/grub2.cfg |grep "^[[:space:]]\+[^[:space:]]\+"
[root@CentOS7 scripts]#cat /etc/grub2.cfg |grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}"
6、找出“netstat -tan”命令结果中以LISTEN后跟任意多个空白字符结尾的行
[root@CentOS7 scripts]# netstat -tan|grep "LISTEN[[:space:]]*$"
7、显示CentOS7上所有系统用户的用户名和UID
[root@CentOS7 scripts]# cat /etc/passwd |grep "/sbin/nologin"|cut -d":" -f1,3
8、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行
[root@CentOS7 scripts]# cat /etc/passwd |grep "^\([[:alnum:]]\+\>\).*\1$"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
[root@CentOS7 scripts]# df|grep "/dev/sd.*"|tr -s " " |cut -d" " -f1,5 |sort -n
/dev/sda1 16%
/dev/sda2 9%
/dev/sda3 1%
[root@CentOS7 scripts]# df|grep "/dev/sd.*"|tr -s " " |cut -d" " -f1,5|sort -t" " -k2 -nr
/dev/sda1 16%
/dev/sda2 9%
/dev/sda3 1%
[root@CentOS7 ~]# df |grep "/dev/sd"|egrep -o "[0-9]{1,3}%"
1.6.1.6 egrep扩展的正则表达式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
-
扩展正则表达式的元字符:
-
字符匹配:
-
. 任意单个字符
-
[] 指定范围的字符
-
[^] 不在指定范围的字符
-
-
次数匹配:
-
*:匹配前面字符任意次
-
?: 0或1次
-
+:1次或多次
-
{m}:匹配m次
-
{m,n}:至少m,至多n次
-
-
位置锚定:
-
^ :行首
-
$ :行尾
-
<, \b :词首
-
>, \b :词尾
-
-
分组: ()
-
后向引用:\1, \2, ...
-
或者: a|b: a或b
-
C|cat: C或cat
-
(C|c)at:Cat或cat
-
1.6.2 练习
1、显示三个用户root、mage、wang的UID和默认shell
[root@CentOS7 scripts]# cat /etc/passwd |egrep "^(root|mage|wang)\>"|cut -d: -f1,3,7
root:0:/bin/bash
mage:4035:/bin/bash
wang:4049:/bin/bash
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一 个小括号的行
[root@CentOS7 scripts]# cat /etc/rc.d/init.d/functions |egrep "^[[:alnum:]_]+\>\("
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@CentOS7 scripts]# echo /etc/init.d/functions/ |egrep -o "[^/][[:alnum:]_]+/?$"
[root@CentOS7 scripts]# echo /etc/init.d/functdfioj_123/ |egrep -o "[^/]+/?$"
functdfioj_123/
4、使用egrep取出上面路径的目录名
[root@CentOS7 scripts]# echo /etc/init.d/functdfioj_123/ |egrep -o "/.*/?$"
5、统计last命令中以root登录的每个主机IP地址登录次数
[root@CentOS7 scripts]# last |egrep -o "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>\.([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>\.([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>\.([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-4][0-9]|25[0-5])\>" |sort|uniq -c
1 172.16.253.196
103 192.168.110.1
1 192.168.110.128
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
0-9:[0-9]
10-99:[1-9][0-9]
100-199:1[0-9][0-9]
200-249:2[0-4][0-9]
250-255:25[0-5]
7、显示ifconfig命令结果中所有IPv4地址
ifconfig |egrep -o "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-5]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-5]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-5]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-5]|25[0-5])"
[root@centos6 ~]# hostname -I
192.168.24.6
8、将此字符串:welcome to centos linux
中的每个字符去重并排序,重复 次数多的排到前面
[root@CentOS7 scripts]# echo "welcome to magedu linux "|egrep -o "[[:alpha:]]"|sort |uniq -c|sort -nr
3 e
2 u
2 o
2 m
2 l
1 x
1 w
1 t
1 n
1 i
1 g
1 d
1 c
1 a
echo "welcome to magedu linux"|sed 's/[[:space:]]/\n/g'|sed -r 's/([[:alpha:]])/\1\n/g'|sed '/^$/d'|sort |uniq -c |sort -nr
[:space:] ↩︎