小Q:说真话的唯一好处,就是不必记住你说过什么。
===========================================================
一:简介
g r e p(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
二:选项
-c 只显示有多少行匹配,而不具体显示匹配的行内容。
--color 匹配字符以颜色显示,--color=auto
-i 在字符串比较的时候忽略大小写。==-y
-o 只输出匹配到的地方,不输出整行
-e 可以进行连续匹配
-n 在每一行前面打印改行在文件中的行数。
-v 反向检索,只显示不匹配的行。
-f 后面加文件,匹配文件中的样式
-r/-R 如果文件参数是目录,该选项将递归搜索该目录下的所有子目录和文件。== -d <recurse>
-w 只显示完整单词的匹配。
-x 只显示完整行的匹配。
-A 打印匹配行,及其后两行
-B 打印匹配行,及其前两行
-C 打印匹配行,及其上下各两行
-l 只显示包含匹配模板的行的文件名清单。
-L 只显示不包含匹配模板的行的文件名清单。
-h 只显示搜索的内容,不显示文件名。
-H 显示搜索内容同时,显示文件名称。
-E 扩展grep=egrep,即可取代脱义符‘\’
-q 不显示任何信息,退出
--include 只匹配包含后面内容的样式
--exclude or --exclude-from 见后面细解
三:入门实例
1.只打印匹配内容的行数:
#grep -c root /etc/passwd
2
2.以颜色打印出匹配字段
#grep --color root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3.显示不匹配的行,不区分大小写
#grep -i -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
4.只进行完整单词的匹配
# grep -w --color roo /etc/passwd
# grep -w --color root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
5.显示并打印目录下包含匹配行的文件名
# grep -l --color -r "root:x:0:0:root:/root:/bin/bash" /etc
/etc/passwd
grep: /etc/rc4.d/S98gshelld: 没有那个文件或目录
grep: /etc/rc5.d/S98gshelld: 没有那个文件或目录
grep: /etc/rc6.d/K01gshelld: 没有那个文件或目录
grep: /etc/rc0.d/K01gshelld: 没有那个文件或目录
6.在打印匹配行的同时,将文件名至于首段
# grep -H root /etc/passwd
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
7.有特殊符号时,需要用\进行转义,或用-E实现转义
# grep "root:/bin/" /etc/passwd
# grep -E "root:/bin/" /etc/passwd
root:x:0:0:root:/root:/bin/bash
==#grep "root\:\/bin\/" /etc/passwd
8.在多个文件中查找
grep "match_pattern" file_1 file_2 file_3 ...
9.-e 制动多个匹配样式
echo this is a text line | grep -e "is" -e "line" -o is line
10.匹配文件中的样式
# cat list
aaa
bbb
# echo aaa bbb ccc ddd eee |grep -f list -o
aaa
bbb
11.打印出匹配样式的后两行
#cat /etc/passwd |grep --color -A 2 "nobody"
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
附加:
在grep搜索结果中包括或者排除指定文件
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
四:正则表达式(要匹配字符本身,在字符前加“\”)
正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。
打印字符
$ 匹配输入字符串的结尾位置。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
. 匹配除换行符 \n之外的任何单字符。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
( ) 标记一个子表达式的开始和结束位置。
[ 标记一个中括号表达式的开始。
{ 标记限定符表达式的开始。
| 指明两项之间的一个选择。
非打印字符
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d 数字字符匹配。等效于 [0-9]。
\D 非数字字符匹配。等效于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
举例:(需要在匹配符外加引号)
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配×××:\d{15}|\d{18}
评注:中国的×××为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
---------------------------------------------------------------------------------------------------
鸟哥:http://vbird.dic.ksu.edu.tw/linux_basic/0330regularex_2.php
第一次的记录:
转载于:https://blog.51cto.com/tengxiansheng/1750972