16 文本匹配工具grep (从新手到菜鸟的Linux教程)

我们来说一些实际的事情。看过系统日志的同学们应该知道,那种日志……实在是太长了。如果我只想看特定的几种分类(指通过关键单词可以分类的情况),该怎么办呢?

首先做一些准备工作:

wang:~$ dmesg > syslog
wang:~$ less syslog
[    0.000000] microcode: CPU0 microcode updated early to revision 0x1b, date = 2014-05-29
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
:

天了噜。

这个时候倒是可以先键入 / 然后再打要搜索的单词,比如 Bluetooth :

[    4.419788] usb 3-1.3: Product: Bluetooth USB Host Controller
[    4.419790] usb 3-1.3: Manufacturer: Atheros Communications
[    4.419792] usb 3-1.3: SerialNumber: Alaska Day 2006

但是这种办法是交互式的,也就是说没有办法“自动化”。所以我们就需要一个“自动”的命令grep啦。

grep 的名字来源于上古时期的文本编辑器ed中的命令g/re/p(globally search a regular expression and print)。所以它的工作就是查找匹配所有满足条件的行,并把它们打印出来。语法是先加待搜索的单词,再跟上文件名,比如:

wang:~$ grep Bluetooth syslog
[    4.419788] usb 3-1.3: Product: Bluetooth USB Host Controller
[   15.518235] Bluetooth: Core ver 2.20
[   15.518261] Bluetooth: HCI device and connection manager initialized
[   15.518266] Bluetooth: HCI socket layer initialized
...

(没想到还是太长了)

grep 有一些开关/选项。-i可以忽略大小写,而-v能让不匹配的行输出,就是反向输出。


什么,听说你要试试ed

wang:~$ ed
help
?
exit
?
quit
?
I'm getting angry!!!
?
Let me OUT OF HERE!!!
?
!@#WAefewrfr!r32Rqw fa@#Rf23qFq ef
sh: 1: @#WAefewrfr!r32Rqw: not found
!