在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])\>