1 命令:grep
2 格式:grep [option] "pattern" filename
3 选项:
4 -v:反向选择
5 -i:忽略大小写
6 -n:显示行号
7 -c:统计行数
8 -o:仅显示匹配到的字符串
9 -w:匹配整个单词
10 -q:不输出任何信息
11 -A 2:after 显示后2行
12 -B 3:before 显示前3行
13 -C 3:context 前后各3行
14 -e:实现多个选项间的逻辑关系
15 grep -e root -e mail /etc/passwd
16 -E:相当于egrep,用于使用拓展的正则表达式
17 -F:相当于fgrep,不支持正则表达式
复制代码
正则表达式(Regular expression)
什么是正则表达式
Regular expression(正则表达式)是由一类特殊字符及文本字符编写的模式,其中有些字符(元字符)不代表字符的字面意义,而表示控制或通配功能。
那些程序支持正则表达式
grep,sed,awk,vim,less,nginx,varnish
在man中查询
我们可以在正则man手册中查找正则的用法
man 7 regex
正则表达式的分类
基本正则表达式
扩展的正则表达式
元字符的分类
字符匹配,匹配次数,位置锚定,分组
基础RE(用于grep)
字符匹配
1 . 匹配任意单个字符
2 [] 匹配指定范围内的任意单个字符
3 [^] 匹配指定范围外的任意字符
匹配次数:用在要指定的次数的字符后面,用于指定前面的字符出现的次数
复制代码
1 * 匹配前面的字符任意次(包括0次)
2 .* 任意长度的任意字符
3 \? 匹配前面的字符0次或一次
4 \+ 匹配前面的字符至少一次
5 \{n\} 匹配前面的字符n次
6 \{m,n\} 匹配前面的字符至少m次,最多n次
7 \{,n\} 匹配前面的字符最多n次
8 \{n,\} 匹配前面的字符最少n次
复制代码
位置锚定:用于定位出现的位置
复制代码
1 ^ 行首锚定
2 $ 行尾锚定
3 ^$ 空行
4 ^[[:space:]]$ 空白行
5 \<,\b 词首锚定,用于单词模式的左侧
6 \>,\b 词尾锚定,用于单词模式的右侧
7 \<pattern\> 匹配整个单词
复制代码
分组:
将一个或多个字符捆绑在一起,当做一个整体进行处理,如root\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录在内部的变量中,这些变量的命令方式为\1,\2,\3...
\1 表示从左侧起第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
示例:
string1\+\(string2*\)
\1:string1\+string2*
\2:string2
后向引用:
引用前面的分组括号中的模式所匹配的字符,而非模式本身
或者:\|
扩展RE(用于egrep或grep —E)
字符匹配:
1 . 匹配任意单个字符
2 [] 匹配指定范围内的任意单个字符
3 [^] 匹配指定范围外的任意字符
匹配次数
1 * 匹配前面的字符任意次(包括0次)
2 ? 匹配前面的字符0次或一次
3 + 匹配前面的字符至少一次
4 {n} 匹配前面的字符n次
5 {m,n} 匹配前面的字符至少m次,最多n次
位置锚定
1 ^ : 行首
2 $ : 行尾
3 \<, \b : 语首
4 \>, \b : 语尾
分组:
1 ()
2 后向引用: \1, \2, ...
或者:
1 a|b: a或b
2 C|cat: C或cat
3 (C|c)at:Cat或cat
特殊字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:xdigit:] 十六进制数字
grep
1、显示/proc/meminfo文件中以大小s开头的行(要求:使用两种方法)
cat /proc/meminfo | grep "^[sS]"
cat /proc/meminfo | grep "^[s\|S]"
cat /proc/meminfo | grep "^s\|^S"
2、显示/etc/passwd文件中不以/bin/bash结尾的行
cat /etc/passwd | grep -v "/bin/bash$"
3、显示用户rpc默认的shell程序
cat /etc/passwd | grep "^rpc\>" | grep -o "[^/]\+$"
cat /etc/passwd | grep "^rpc\>" | cut -d"/" -f6
4、找出/etc/passwd中的两位或三位数
cat /etc/passwd | grep "\b[0-9]\{2,3\}\b"
5、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白 字符的行
cat grub2.txt | grep "^[[:space:]]\+[[:graph:]].*"
6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
1
netstat -tan | grep "LISTEN[[:space:]]*$"
7、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd | cut -d ":" -f 1,3 | grep -v "\b0$" | grep "\b[0-9]\{1,3\}\b"
cat /etc/passwd | cut -d ":" -f 1,3 | grep -ve "\b0$" -e "[0-9]\{4,\}"
8、添加用户bash、 testbash、 basher、 sh、 nologin(其shell为/sbin/nologin),找出 /etc/passwd用户名同shell名的行
cat /etc/passwd | grep "\(^[[:alnum:]]\+\>\).*\<\1$"
9、利用df和grep及sort,取出磁盘各分区利用率,并从大到小排序
df | grep "/dev/sd" | grep -o "[0-9]\{1,\}%" | sort -nr
egrep
1、显示三个用户root、 mage、 wang的UID和默认shell
cat /etc/passwd | egrep "^root|^mage|^wang" | tr -s ":" "/" | cut -d"/" -f3,8
cat /etc/passwd | egrep "^root|^mage|^wang" | cut -d":" -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions | egrep -o "^([[:alpha:]]+|_).*[[:graph:]]\(\)"
cat /etc/rc.d/init.d/functions | egrep -o "^.*[[:grpha:]]\(\)"
cat /etc/rc.d/init.d/functions |egrep -o "^.*\>\(\)"
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/*$"
echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/?$"
echo /etc/rc.d/init.d/functions |egrep "[^/]+/?$" -o
4、使用egrep取出上面路径的目录名
echo /etc/rc.d/init.d/functions | egrep -o ".*/\<"
echo /etc/rc.d/init.d/functions |egrep -o ".*/." |egrep -o
5、统计last命令中以root登录的每个主机IP地址登录次数
last | grep ^root | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c
6、利用扩展正则表达式分别表示0-9、 10-99、 100-199、200-249、 250-255
echo {1..1000} | egrep -o "\b[0-9]\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b[0-9]{2}\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b1[0-9]{2}\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b2[0-4][0-9]\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b25[0-5]\b" | tr "\n" " " ;echo
7、显示ifconfig命令结果中所有IPv4地址
ifconfig|egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
8、将此字符串: welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
echo "welcome to magedu linux" | tr -d " " | grep -o "." | sort | uniq -c | sort -nr
shell一则-按文件每行长度排序
按文件每行长度排序
awk -F: '{print length($0) " " $0}' /etc/shadow | sort -r -n | awk '{print $2}'
正则就是有一定规律的字符串,不仅可以使用命令行工具grep, sed,awk ,egrep去引用正则,还可以把正则嵌入到 nginx,apache,甚至php,python中。特殊符号(. * + ? |)
grep,主要用来过滤出指定的行。指定的条件,用正则表达式。
1、语法选项
grep [-civnABC] 'word' filename
-n 在输出符合要求的行的同时,连同行号一起输出
-c 打印符合要求的行数
-v 打印不符合要求的行
--color 匹配到的关键字用红色标识
-A 后跟一个数字,空格可有可无,-A2 表示打印符合要求的行以及下面两行
-B 后跟一个数字,-B2 表示打印符合要求的行以及上面两行
-C 后跟一个数字,-C2 表示打印符合要求的行以及上下各两行
-r 把目录下面所有的文件全部遍历 【不是很常用】
-i 不区分大小写
-E 脱意字符\的作用
#grep -r "iptables" /etc/* 显示该目录下所有包含该字符的信息,包含文件路径
#grep -rh "iptables" /etc/* 不显示文件路径,直接显示结果
2、例子介绍
#alias grep='grep --color'
#cp /etc/passwd 1.txt
#grep '[cnsoe]' 1.txt 取其中任意一个进行匹配,匹配cnsoe中的任何一个
#grep '[0-9]' 1.txt 匹配包含任意数字
#grep '[^0-9]' 1.txt 匹配包含非数字的行,某行有数字,字母,特殊字符,也会显示出来。
#grep '^[0-9]' 1.txt 取数字开头的行
#grep -v '[0-9]' 1.txt 匹配不包含数字的行,可匹配空行,特殊字符
#grep -v '^[0-9]' 1.txt 匹配非0-9开头的行,可匹配空行,特殊字符
#grep '^[^0-9]' 1.txt 取不以数字开头的行,可匹配特殊符号,不包括空行
#grep '^$' 1.txt 取空行,不包含任何字符的行,空格也算特殊字符
#grep '[^a-zA-Z]' 匹配包含非字母的行,并非全部都没有字母,只要含有非字母都可以
#grep '^[1-9][0-9]*$' 1.txt:匹配开头为1到9其中一个数字,结尾是0个或多个数字 ?????
'r.o' .表示任意一个字符,包括特殊符号。
'r\?o' ?表示零个或一个?前面的字符;匹配出的结果又 roo ,r\?o中表示匹配前面字符0次或1次,即匹配ro或o,所以,roo应该分开看,前两个字符ro是匹配字符‘r’一次,o是匹配字符‘r’0次,同理oo也是分开看,都是匹配字符‘r’0次。
'r+o' +表示大于等于1个+号前面的字符
'r*o' *表示零个或多个*号前面的字符,
'r.*o' .* 任意一个字符+任意一个星号*前面的字符==任意零个或多个任意字符,r开头o结尾的字符,中间不重要,可以使特殊符号,贪婪匹配
'r*.o' 匹配出o前面有零个或者多个任意字符的行
-E 'r?o' -E 和 脱意符号\的作用一样,grep -E == egrep
过滤出带有某个关键字的行并输出行号
#grep -n 'root' 1.txt
过滤出不带某个关键词的行并输出行号
#grep -n -v 'root' 1.txt
过滤出所有包含数字的行
#grep '[0-9]' 1.txt 任意一个数字都可以匹配,多个也可以
过滤所有不包含数字的行
#grep -v '[0-9]' 1.txt
去除所有以"#"开头的行
#grep -v '^#' 1.txt
去除所有空行和以 # 开头的行
#grep -v '^$' 1.txt |grep -v '^#'
过滤英文字母开头的行
#grep '^[a-zA-Z]' 1.txt
过滤以非数字开头的行
#grep '^[^0-9]' 1.txt 匹配结果会首字母会颜色标出,匹配特殊符号
#grep -nv '^[0-9]' 1.txt 匹配结果差别在下面这个没有颜色,匹配特殊符号以及空行
过滤任意一个或多个字符 包含r.o,s*.d,p.*x的字符
#grep 'r.o' 1.txt ; grep 'r*t' 1.txt ; grep 'r.*t' 1.txt
. 表示任意一个字符
* 表示 零个 或 多个 前面的字符
.* 表示零个或多个任意字符,空行也包含在内
过滤出包含 root 的行以及下面一行
#grep -A 1 'root' 1.txt
过滤出包含root的行以及上面一行
#grep -B 1 ‘root' 1.txt
指定过滤字符次数 匹配一个oo的行
#grep 'o\{2\}' 1.txt
过滤包含2个字母o的行
3、egrep
grep工具的扩展,可以实现所有的grep功能,可以用grep -E代替egrep。为方便可全部使用egrep来代替grep。
#alias egrep='egrep --color'
#grep 'r\?o' 1.txt == egrep 'r\?o' 1.txt== grep -E 'r?o' 1.txt
匹配 1 个或 1 个以上 + 前面的字符 匹配o+
#egrep 'o+' 1.txt
匹配 0 个或 1 个 ? 前面字符 匹配o?
#egrep 'o?' 1.txt
匹配 roo 或者 匹配 body
#egrep 'roo|body' 1.txt
匹配包含roo 并且 包含 log 的行
#egrep 'roo' 1.txt |egrep 'roo|log'
#egrep 'log' 1.txt |egrep 'roo|log'
用括号表示一个整体,例子会匹配 roo 或者 ato
#egrep 'r(oo)|(at)o' 1.txt
匹配 1 个或者多个 'oo'
#egrep '(oo)+' 1.txt
匹配 1 到 3 次 'oo'
#egrep '(oo){1,3}' 1.txt
匹配结果出现9个o,{1,3}进行了多次匹配,也可以理解为包含但不限于1-3次。1.txt文件中某一行能匹配oo 1次、2次、3次都符合条件。对于 oooooooooo,前面6个o 符合:匹配oo3次;后面4个o符合匹配oo2次
#egrep '(oo){6}' 1.txt 匹配6个
#egrep '(oo)'{6,} 1.txt 匹配6个以上
4、. * + ? 总结 统配字符
. 任意字符,包括特殊字符,下划线,空格,
* 零个 或者 多个 *前面的字符
.* 任意数量任意字符,包括空行
*. 'r*.o' 匹配出o前面有零个或者多个任意字符的行
+ 表示 1 个或 多个 + 前面的字符 仅限egrep
? 表示 0 个或 1 个?前面的字符 仅限egrep
grep 表达式里面出现 ? + ( ) { } | 这几个特殊符号,需要前面加脱意符号,或者使用 grep -E ,或者使用egrep,故方便起见,全部使用egrep。
扩展 --include 指定文件
grep 其实还可以这样使用:
在tmp目录下,过滤所有 *.txt 文档中含有root的行
grep -r --include="*.txt" 'root' /
data目录下,所有 *.php 文档中包含eval的行
egrep -rhn --include="*.php" 'eval' 1.txt