grep: Global Regular Expression Print

系统学习一下grep工具(第n次遇到了)

grep - Global Regular Expression Print 全局正则表达式打印

grep是利用正则表达式来对文本文件进行检索的,它会输出给定模式相匹配的文本行内容,若没有给定输入文件,则grep会在当前文件递归搜索。grep有两个变式,分别是egrep和fgrep。这两个变式目前已经被弃用了,但是依旧保留在系统中,以提供向先前版本或程序的兼容性。现在已经被集成在grep的-E和-F选项中了,当然我们现在依旧可以用egrep和fgrep。

1
2
3
以下内容摘自man grep:
In addition, the variant programs egrep, fgrep and rgrep are the same as grep -E, grep -F, and
grep -r, respectively. These variants are deprecated, but are provided for backward compatibility.

更具体地,grep的-E选项是将输入的PATTERN作为扩展正则表达式来对文本文件进行检索,而-F选项则是讲PATTERN作为固定的字符串关键字来进行检索,而非正则表达式。

假设我们有文本文件file.txt用于展示,如下:

1
2
3
4
5
6
7
8
9
10
$ cat file.txt
ostechnix
Ostechnix
o$technix
linux
linus
unix
technology
hello world
HELLO world

首先,我们要在上述文本文件中按照正则表达式来搜索nix关键字,可用如下指令:

1
2
3
4
5
$ grep nix file.txt
ostechnix
Ostechnix
o$technix
unix

如果我们要搜索的模式包含空格,那么在shell编程的基础上,需要用单引号将内容引用起来。

1
2
$ grep 'hello world' file.txt 
hello world

对于-n选项,可以用来标记输出的行号,方便定位。

1
2
3
4
5
junrong@junrong-virtual-machine:~/Desktop/The-Missing-Semester/missing$ grep -n nix file.txt 
1:ostechnix
2:Ostechnix
3:o$technix
6:unix

grep默认是对于大小写敏感的,也即case-sensitive。当我们以os为模式搜索的时候,Os模式不会被匹配到。

1
2
$ grep os file.txt 
ostechnix

但是,man grep可知,-i选项可以忽略大小写进行匹配。

1
2
3
$ grep -i os file.txt 
ostechnix
Ostechn1x

grep还可以将管道的输出作为输入来进行文本匹配。

1
2
$ cat file.txt | grep os
ostechnix

配合-E选项,grep(或者说老版本的egrep)可以做到更复杂的正则表达式匹配。下面是一些例子:

假设对于文件file.txt的内容,我们要从中找出字母o出现至少2次的所有单词,该如何表达?

1
$ grep -E '^.*(o).*(o).*$' file.txt

或者用更优雅的表述:限制条件解读为以o为结尾的字符串的计数至少为2,后面的.*保证了匹配的通用性。

1
$ grep -E '^(.*o){2}.*$' file.txt

配合-F选项,fgrep无法识别正则表达式或者特殊的字符,但是可以用在需要计算正则表达式的地方。

bg: background

Linux中的bg命令可以允许我们将管理的服务放到后台运行,是一种任务控制指令。可以进行一定的任务调度管理。

基本语法:

1
$ bg [job]

后面的job参数,一般有如下的四种表达方式:

1
2
3
4
%n	会发送任务,也即在jobs中看到的编号为n的任务到后台挂起运行。注意,这里的n不是pid,而是用户空间运行的进程,也即jobs list的编号。
%%或%+ 将当前任务发送到后台挂起运行,当前任务通常就是在foreground前台bash shell中正在运行的任务。
%- 将前一个任务发送到后台运行
%sting 将名称开头为string的任务发送给后台运行

替代或等价的指令为:proc [ param ] &,最后的取地址符代表将其送到后台运行。两者的区别在于,&只能在任务创建的时候直接挂在后台,而bg可以将任务执行一半的时候就挂到后台。