grep、awk、sed三剑客之grep

grep = global regular expression print(全局正则表达式打印)
    用最简单的话来说,grep是在文件中查找并且打印出与查找字符串匹配的行。从文件的第一行开始,grep依次将每一行复制到缓冲区中,比较其与查找字符串,如果匹配通过,则将该行打印在屏幕上,直到扫描完文件中的所有行。注意程序中没有任何给grep存储行、修改行、或是查找行的一部分的地方。
示例数据
创建一个名为a_file的文件,文件内容如下:

boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots

命令:grep "boo" a_file

(该命令将会扫描a_file中的每一行,并且打印出包含'boo'的所有行)

打印结果:

boot
book
booze
boots

常用的参数选项
    如果你要处理一个大且复杂有相似点的文件,grep将会方便地帮你定位行在文件中的地方,这样你可以更容易追踪特定字符串。如果你需要以编辑的方式打开文件做一些修改,可以通过加上 -n 参数来实现。

命令:grep -n "boo" a_file

这个命令将会返回更多有用的结果,它展示了匹配字符串所在行号
1:boot
2:book
3:booze
5:boots

另一个有趣的转换是 -v,它将打印完全相反的结果。换句话说,grep将会打印所有不匹配该字符串的所有行。在下面的例子中,grep将会打印所有不含"boo"的行,并和上个例子一样展示行号。

命令:grep -vn "boo" a_file

这个命令,它将会打印
4:machine
6:bungie
7:bark
8:aaradvark
9:robots

-c 选项告诉grep不打印匹配的行,仅仅只展示查询结果匹配行的数量,例如,下面将会打印4,因为"boo" 在a_file中被匹配了4次。

grep -c "boo" a_file
4

-l 选项仅打印文件中存在匹配行的文件名。当在大量文件中查询含有匹配字符串的文件时非常有用。例如:
命令:grep -l "boo" *

一个更有用的选项查找非代码文件是 -i,忽略大小写,将大小写一视同仁。下面的例子中,包含 "boo"的行也会被打印出,即使查找字符串是大写。
命令:grep -i "BOO" a_file

-x 选项仅仅用来精确匹配。换句话说,下面的命令不会打印任何内容,因为没有行仅仅只包含"boo"。
命令:grep -x "boo" a_file

最后,-A允许你指定文件中额外的行展示,所以你能得到查找字符串的行加上额外的行。例如:

grep -A2 “mach” a_file
machine
boots
bungie

正则表达式
    正则表达式是一种简洁的描述复杂文本的模式。你可以使用grep搜索模式。其他工具允许您使用正则表达式(“regexps”) 以复杂的方式修改文本。到目前为止,我们一直使用的普通字符串实际上只是非常简单的正则表达式。当列举文件名等,如果你使用了”*“或”?“之类的通配符你也可能会遇到。你也许使用grep搜索基本的正则表达式,例如在文件中查找以字母’e’结尾的行。
命令:grep "e$" a_file

它将会打印
booze
machine
bungie

如果你想要更广范围的正则表达式命令,那么你必须使用‘grep -E’(或者是egrep命令)。例如,正则表达式命令?将会匹配1次或0次前面的字符。 -E匹配或的关系。grep -E ‘aWord|bWord’ test 表示匹配aWord或bWord的意思。
命令:grep -E "boots?" a_file

这个查询将会返回
boot
boots

你可以通过管道(|)来组合多个查询,(I) 代表”或“的意思,你可以通过如下方式查询:

grep -E "boot|boots" a_file
boot
boots

特殊字符
如果你想要搜索的是一个特殊字符呢?如果你想查找所有包含美元符号’$‘的所有行,你不能使用 grep ‘$’ a_file,因为 '$'将会作为一个正则表达式被打断,最后你将会得到以前一个字母结尾的所有行,为了逃避这种模式,你得使用如下方式搜索

grep '\$' a_file
broken$tuff

你也可以使用 -F选项,它代表“固定字符串”或“快速”,这样你可以仅仅用字符串文字搜索,不会变成正则表达式进行解析。

参考:https://www-users.york.ac.uk/~mijp1/teaching/2nd_year_Comp_Lab/guides/grep_awk_sed.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值