Linux入职基础-5.21_搜索grep(应用实战5)

搜索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命令


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值