Shell-03Shell三剑客之grep

在shell里面是有文本三剑客的,awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。

  • grep更适合单纯的查找或匹配文本
  • sed更适合编辑匹配到的文本
  • awk更适合格式化文本,对文本进行较复杂格式处理。

grep介绍

grep家族: grep, egrep, fgrep

grep: 根据模式搜索文本,并将符合模式的文本行显示出来。

Pattern: 文本字符和正则表达式的元字符组合而成匹配条件

grep [options] PATTERN [FILE...]
	-i:忽略大小写
	--color:匹配到的字符带颜色
	-v::显示没有被模式匹配到的行
	-o:只显示被模式匹配到的字符串
	-E: 使用扩展正则表达式
	-A n: 显示匹配到的行和其后的n行
	-B n: 前的n行
	-C n: 前后各n行
	-n	显示匹配的行号
	-w	被匹配的文本只能是单词,而不能是单词中的某一部分
	-c	统计匹配的行数,而不是显示被匹配到的内容
	-R,-r	查询递归目录下的所有文件

另外一种格式

cat [FILE...] | grep [options] PATTERN

格式应用示例

grep '正则表达式' xxx.txt
egrep '正则表达式' xxx.txt

egrep支持拓展正则表达式
如果grep需要支持拓展正则表达式的话需要
grep -E '正则表达式' xxx.txt
grep -A5 匹配你也的内容并且显示接下来的5行
grep -B5 匹配你要的内容显示上面的5行
grep -C5 匹配上下的五行
grep -c 统计出现了多少行,类似wc -l
grep -v 取反,排除
grep -n 显示行号
grep -i 忽略大小写
grep -w 精确匹配

#给grep和egrep加上颜色
x alias grep='grep --color=auto' alias egrep='egrep --color=auto'

正则表达式

正则表达式在shell里面区分为基本正则表达式(BRE)与扩展正则表达式(ERE),使用扩展正则表达式是包含基本正则表达式的,这个是可以确认的。

grep 使用的元字符
  • grep : 使用基本元字符 ^,$,.,*,[],[^],{},\<,\>,\(\),\+,\|
  • egrep(或grep -E): 使用的扩展元字符 +,?,{},|,()

基本正则表达式

通配符(PATTERN)
1. *: 匹配前导符任意长度的任意字符
2. .: 匹配任意单个字符
3. .*: 任意多个字符	
4. []: 匹配指定范围内的任意单个字符
5. [^]:  匹配指定范围外的任意单个字符
6. [ - ]: 匹配自动范围内的一个字符[0-9a-z]ove
位置锚定
1. ^: 锚定行首,此字符后面的任意内容必须出现在行首
2. $: 锚定行尾,此字符前面的任意内容必须出现在行尾
   ^$: 空白行
3. \<\b: 锚定词首,其后面的任意字符必须作为单词首部出现
4. \>\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现 
分组
():分组
C|cat:  C或cat, 不是Cat或cat,这个用 '(C|c)at'
匹配次数
x{m}	字符X重复出现M次	o{5}
x{m,}	字符X重复出现M次以上	o{5,}
x{m,n}	字符X重复出现M-N次	o{5,10}

扩展正则表达式

正则表达式:REGular EXPression, REGEXP

+	匹配一个或多个前导符	[a-z]+ove
?	匹配零个或一个前导符	lo?v3
a|b	匹配a或b	love|hate
(a|b)	找出群组字符串
()+ : 多个重复群组判别
(..)(..)\1\2	标签匹配字符	(love)able\1er

POSIX字符类

表达式	      功能	
[:digit:]	任何数字	
[:xdigit:]	任何十六进制数字	
[:alpha:]	任何字母	
[:lower:]	任何小写字母	
[:upper:]	任何大写字母	
[:alnum:]	任何字母或数字	
[:cntrl:]	ASCII控制字符(ASCII 0~31 和 ASCII 127[:punct:]	不属于[:alnum:][:cntrl:]的任何字符	
[:blank:]	空格或制表符([\t ][:space:]	任何空白字符,包括换行符,回车符等在内的所有空白([\f\n\r\t\v ][:print:]	任何可打印字符	
[:graph:][:print:],但不包括空格

练习

# 空行
/^$/
/^[ \t]*$/   # 开头0个或多个空格或字符表结尾

# 注释行
/^#/
/^[ \t]*#/   # 0个或多个空格或字符表开头后#号

# 在file文件中过滤掉字符串'str'所在的行
grep -v "str" file
# 在file文件中查找时间在2017:22:50~2017:22:59所在的行
grep -E "2017:22:5[0-9]" file 
# 在file文件中查找不包括360的行
grep -E "^[^360]" file 
# 在file文件中查找包括w和t的行
grep -E "w*t" file
# 在file文件中查找大于560小于893的行
grep -E "[5-8][6-9][0-3]" file
# 在file文件中查找包含两个9的行
grep -E "9{2}" file
# 查找大于两个9的行
grep -E "9{2,}" file 
# 查找file文件中的空行
grep -E "^$" file 
# 查找包括?的行
grep "?" file 
# 查找文件中以w开头的行
grep -E "^w" file 
# 查找文件中不是以w开头的行
grep -E "^[^w]" file

1、显示/proc/meminfo文件中以不区分大小的s开头的行;

grep -i '^s' /proc/meminfo
grep '^[sS]' /proc/meminfo

2、显示/etc/passwd中以nologin结尾的行;

grep 'nologin$' /etc/passwd
取出默认shell为/sbin/nologin的用户列表
grep "nologin$' /etc/passwd | cut -d: -f1
取出默认shell为bash,且其用户ID号最小的用户的用户名
grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1 

3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;

grep ':[0-9]:' /etc/inittab

5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;

grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;

grep '^[0−9][0−9].*\1$' /etc/inittab

7、找出某文件中的,1位数,或2位数;

grep '[0-9]\{1,2\}' /proc/cpuinfo
grep --color '\<[0-9]\{1,2\}\>' /proc/cpuinfo

8、找出ifconfig命令结果中的1-255之间的整数;

需要使用扩展正则表达式
ifconfig | egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\>'

9、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd

grep '^student\>' /etc/passwd | cut -d: -f3
id -u student

student1
student2

10、分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:

l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3

grep '^l[0−9][0−9]:\1.*\1$' /etc/inittab

egrep及扩展正则表达式

**扩展正则表达式:**省略很多反斜线

grep -E = egrep

练习

1、显示所有以数字结尾且文件名中不包含空白的文件;

bash特性详解时的未解问题

ls .*[^[[:space:]].*[0-9]$ 

找出/boot/grub/grub.conf文件中1-255之间的数字;

\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>

找出ifconfig中的IP地址

ifconfig | egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
ifconfig | egrep --color '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

找出ifconfig中的ABC 3类IP地址

IPv4:

5类:A B C D E

A:1-127

B:128-191

C:192-223

\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值