搜索grep(应用实战5)
简介:
grep (global search regular expression),全面搜索正则表达式,文本搜索工具。Unix的grep家族包括grep、egrep和fgrep。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep。
linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
功能:
能使用正则表达式搜索文本,并把匹配的行打印出来。
语法:
grep [-abcEFGhHilLnqrsvVwxy] [-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范 本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数:
-a或--text 不要忽略二进制的数据。
-A<显示列数>或--after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之后的内容。
-b或--byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
-B<显示列数>或--before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。
-c或--count 计算符合范本样式的列数。
-C<显示列数>或--context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作>或--directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>或--regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。
-E或--extended-regexp 将范本样式为延伸的普通表示法来使用。
-f<范本文件>或--file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
-F或--fixed-regexp 将范本样式视为固定字符串的列表。
-G或--basic-regexp 将范本样式视为普通的表示法来使用。
-h或--no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H或--with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。
-i或--ignore-case 忽略字符大小写的差别。
-l或--file-with-matches 列出文件内容符合指定的范本样式的文件名称。
-L或--files-without-match 列出文件内容不符合指定的范本样式的文件名称。
-n或--line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。
-q或--quiet或--silent 不显示任何信息。
-r或--recursive 此参数的效果和指定“-d recurse”参数相同。
-s或--no-messages 不显示错误信息。
-v或--revert-match 反转查找。
-V或--version 显示版本信息。
-w或--word-regexp 只显示全字符合的列。
-x或--line-regexp 只显示全列符合的列。
-y 此参数的效果和指定“-i”参数相同。
--help 在线帮助。
范例:
ls -l | grep ^d #1只显示当前目录下的目录文件
ls -l | grep ^[^d] #2显示当前目录下的除目录文件以为的文件
who | grep –v root #3显示除根用户外其他登陆本机的用户
grep -n “yp” yp.conf #4查询目标文件中特定的字符串,显示行号
#5搜索查询结构化的通讯簿(address), 空格+13[0-2]开始的单个字段的用户信息,常用于结构化文件的查询例子。
grep “ 13[0-2]” address grep -in ^s address//查询所有以s开头用户的联系方式
#6将/etc/passwd,有出现 root 的行取出来,同时显示行号,颜色显示
[root@localhost ~]# grep –n --color=auto root /etc/passwd
#7用 dmesg 列出核心信息,再以grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示。
[root@localhost ~]#dmesg | grep -n--color=auto 'eth'
#8在关键字所在行的前两行与后三行也一起捉出来显示
[root@localhost ~]# dmesg | grep -n -A3 -B2--color=auto 'eth'
[root@localhost ~]#grep ‘hello’ * #9在当前目录搜索带'hello'行的文件
#10在当前目录及其子目录下搜索'hello'行的文件
[root@localhost ~]#grep -r ‘hello’ *
接下来演示grep与正则表达式关系
#11搜寻 文件f1中含test 或 tast 这两个单字,其实她们有共通的 't?st' 存在
[root@localhost ~]# grep -n 't[ae]st' f1 //在[] 里面不论几个字符,只代表某『一个』字符
#12要搜索到有 oo 的行,但不想要 oo 前面有 g,可以使用字符类的反向选择[^]
[root@localhost ~]#grep -n '[^g]oo' f1
#13搜索字串是数字与英文,使用[a-z],[A-Z],[0-9]等方式
[root@localhost ~]#grep -n '[0-9]' f1
[root@localhost ~]#grep -n [a-zA-Z0-9] f1
技巧1:行首与行尾字节 ^ $
#14行首字符:如果我想要让 the 只在行首列出
[root@localhost ~]#grep -n '^the' f1
#15要开头是小写字节的那一行就列出
[root@localhost ~]#grep -n '^[a-z]' f1
#16不想要开头是英文字母,则可以是这样
[root@localhost ~]#grep -n '^[^a-zA-Z]' f1
注,^ 符号,在字符类符号(括号[])之内与之外是不同的!在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
#17那如果我想要找出来,行尾结束为小数点(.) 的那一行
[root@localhost ~]#grep -n '\.$' f1 //因为小数点具有其他意义(底下会介绍),所以必须要使用转义字符(\)来加以解除其特殊意义!
#18找出空白行
[root@localhost ~]#grep -n '^$' f1
技巧2:任意一个字节 . 与重复字节 *
这两个符号在正则表达式的意义如下:
. (小数点):代表『一定有一个任意字符』;
* (星号):代表『重复前一个字符,0 到无穷多次』
#19需要找出 g??d 的字串,亦即共有四个字节, 起头是 g 而结束是 d
[root@localhost ~]#grep -n 'g..d' f1
#20想要列出有 oo, ooo, oooo 等等的数据, 也就是说,至少要有两个(含) o 以上
[root@localhost ~]#grep -n 'ooo*' f1
#21想要字串开头与结尾都是 g,但是两个 g 之间仅能存在至少一个 o ,亦即是 gog,goog, gooog.... 等等
[root@localhost ~]#grep -n 'goo*g' f1
#22想要找出 g 开头与 g 结尾的行,当中的字符可有可无
[root@localhost ~]#grep -n 'g.*g' f1 // 这个 .* 的 RE 表示任意字符是很常见的
技巧3:限定连续 RE 字符范围 {},即想要限制一个范围区间内的重复字符数。{ 与 } 的符号在 shell 是有特殊意义的,因此, 我们必须要使用字符 \ 来让他失去特殊意义才行
#23要找到两个 o 的字串
[root@localhost ~]#grep -n 'o\{2\}' f1
#24要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串
[root@localhost ~]#grep -n 'go\{2,5\}g' f1
#25想要的是 2 个 o 以上的goooo....g 呢?除了可以是 gooo*g ,也可以是
[root@localhost ~]#grep -n 'go\{2,\}g' f1
技巧4:扩展grep(grep -E 或者 egrep):
#26打印所有包含NW或EA的行
[root@localhost ~]#egrep 'NW|EA' testfile
[root@localhost ~]#grep 'NW\|EA' testfile //在扩展元字符前面加\,grep会自动启用扩展选项-E
#27搜索所有包含一个或多个3的行
[root@localhost ~]# egrep '3+' testfile
[root@localhost ~]#grep -E '3+' testfile
[root@localhost ~]#grep '3\+' testfile
#28搜索所有包含0个或1个小数点字符的行
[root@localhost ~]#egrep '2\.?[0-9]'testfile
[root@localhost ~]#grep -E '2\.?[0-9]'testfile
[root@localhost ~]#grep '2\.\?[0-9]'testfile
#29搜索一个或者多个连续的no的行
[root@localhost ~]#egrep '(no)+' testfile
[root@localhost ~]#grep -E '(no)+' testfile
[root@localhost ~]#grep '\(no\)\+' testfile
注意:grep命令不能同时指定两个固定的字符串,所有下面我们再介绍egrep命令