bash Shell本身不支持正则表达式,使用正则表达式的是Shell命令和工具
如grep,sed,awk
正则表达式元字符:?、 *、 []、 {}、 ^
这些元字符在通配中的含义与在正则表达式中不一定相同
* 表示任意位置任意字符
echo hell*.txt 匹配结果:hello.txt,hellu.txt, helloo.txt
? 表示1个任意字符
echo hell?.txt 只匹配hello.txt, hellu.txt
[] 表示某1范围
echo [a-z]*.txt 匹配所有以字母a~z开头的txt文件
{} 表示1组表达式的集合
echo {[a-z*.txt, *.pdf]} 匹配a~z开头的txt文件,和pdf文件
^ 表示取反(不代表行首)
echo [a-h]*.[^txt]* 匹配以字母a~h开头并且后缀不是txt的文件
正则表达式
GREP Global search Regular Expression and Print out the line
全局搜索正则表达式并将结果打印按行打印
grep 文本搜索
ps -ef | grep tomcat
grep搜索的数据源:
1. 通过管道传递过来的文本数据
2. 指定文件中进行搜索
grep [选项] [模式] [文件]
在1个或多个文件中搜索满足模式的文本行
模式后面所有字符串被解析为文件名,可以跟多个文件名
option
-c 只输出匹配的行数
-i 搜索时忽略大小写
-h 查询多文件时不显示文件名
-l 只列出符合匹配的文件名,而不列出具体的匹配行
-n 列出所有的匹配行,并显示行号
-w 匹配整词
-x 匹配整行
-r 递归搜索
-E 支持扩展的正则表达式
-F 不支持正则表达式,按字符串字母意思进行匹配
只要模式中包含空格,则必须用引号将整个字符串括起来,否则,空格后面的字符串将被解析为文件名
grep -n x-forwarded-for a.txt b.txt 列出匹配行,并显示行号
more -113 a.txt 根据行号查看该行前后的内容
-c
grep -c Certificate *.txt 只显示包含模式行的数量
-n
grep -n Certificate *.pem 在行内容前面附加该行在文件中的行号
-i
grep -i Certificate *.pem 不区分大小写匹配Certificate
-h
grep -h Certificate *.pem 不再显示匹配行所在的文件名
-l
grep -l Certificate *.pem 只列出符合匹配的文件名,而不列出具体的行
-r
grep -r Certificate * 递归搜索当前目录和子目录
-w grep命令使用-w后,元字符不再解析为特殊含义字符,照字面意思解析
grep -w cer* 00.pem 整词匹配"cer*"
-x
grep -x Hello *.pem 整行匹配"Hello"
grep与正则表达式结合使用
匹配行首
grep ^- *.pem 匹配以'-'开头的行
grep -c ^$ 00.pem 匹配空白行
grep -c ^[^$] 00.pem 匹配非空白行
匹配大小写
grep -n [cC]ertificate 00.pem
grep -i certificate 00.pem
匹配重复字符
grep ^/..../ 00.pem 匹配以"/"开头,跟4个任意字符,接着跟"/"的行
grep ^-*B 00.pem 匹配以"-"开头,重复"-"任意次,然后是"B"字符的行
转义符
grep edu\.org\.cn 00.pem 对"."进行转义,按字面意思处理
grep \-\{5,\} 00.pem 对"-"进行转义
精确匹配
grep "\
或字符,grep需要加-E选项才支持"|"
grep -E "OU|UO" 00.pem
匹配任意字符 .
ls -al | grep .2006. 抓取所有包含2006的行
egrep 等价于grep -E
它是扩展后的grep命令,支持基本和扩展的正则表达式
扩展的正则表达式:
? 匹配0次或1次
+ 至少匹配1次
| 或
() 通常与"|"结合使用,表示一组可选的字符集合
egrep "seu.edu|certificate" 00.pem
egrep "^-+B" 00.pem