常用的Linux Shell工具程序:学习、使用与范例
grep: Global Regular Expression Print
系统学习一下grep工具(第n次遇到了)
grep - Global Regular Expression Print 全局正则表达式打印
grep是利用正则表达式来对文本文件进行检索的,它会输出给定模式相匹配的文本行内容,若没有给定输入文件,则grep会在当前文件递归搜索。grep有两个变式,分别是egrep和fgrep。这两个变式目前已经被弃用了,但是依旧保留在系统中,以提供向先前版本或程序的兼容性。现在已经被集成在grep的-E和-F选项中了,当然我们现在依旧可以用egrep和fgrep。
1 | 以下内容摘自man grep: |
更具体地,grep的-E选项是将输入的PATTERN作为扩展正则表达式来对文本文件进行检索,而-F选项则是讲PATTERN作为固定的字符串关键字来进行检索,而非正则表达式。
假设我们有文本文件file.txt用于展示,如下:
1 | $ cat file.txt |
首先,我们要在上述文本文件中按照正则表达式来搜索nix关键字,可用如下指令:
1 | $ grep nix file.txt |
如果我们要搜索的模式包含空格,那么在shell编程的基础上,需要用单引号将内容引用起来。
1 | $ grep 'hello world' file.txt |
对于-n选项,可以用来标记输出的行号,方便定位。
1 | junrong@junrong-virtual-machine:~/Desktop/The-Missing-Semester/missing$ grep -n nix file.txt |
grep默认是对于大小写敏感的,也即case-sensitive。当我们以os为模式搜索的时候,Os模式不会被匹配到。
1 | $ grep os file.txt |
但是,man grep可知,-i选项可以忽略大小写进行匹配。
1 | $ grep -i os file.txt |
grep还可以将管道的输出作为输入来进行文本匹配。
1 | $ cat file.txt | grep os |
配合-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 | %n 会发送任务,也即在jobs中看到的编号为n的任务到后台挂起运行。注意,这里的n不是pid,而是用户空间运行的进程,也即jobs list的编号。 |
替代或等价的指令为:proc [ param ] &,最后的取地址符代表将其送到后台运行。两者的区别在于,&只能在任务创建的时候直接挂在后台,而bg可以将任务执行一半的时候就挂到后台。