基本概念
管道命令指的是将前面一个命令的输出结果,传递给后面一个命令,这样就可以起到对一个命令进行层层筛选过滤的作用。它使用|
符号作为定界符。这个管道命令|
仅能处理经由前面一个命令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力。那么整体的管道命令可以使用下图表示:
在每个管道后面接的第一个数据必定是命令,而且这个命令必须要能够接受 standard input 的数据才行,这样的命令才可以是为管道命令,例如 less, more, head, tail 等都是可以接受 standard input 的管道命令。至于例如 ls, cp, mv 等就不是管道命令了,因为 ls, cp, mv 并不会接受来自 stdin 的数据。
总而言之,管道命令主要有两个比较需要注意的地方:
- 管道命令仅会处理 standard output,对于 standard error output 会予以忽略
- 管道命令必须要能够接受来自前一个命令的数据成为 standard input 继续处理才行。
下面介绍常用的管道命令。
提取命令
提取命令就是将一段数据经过分析后,取出我们所想要的。或者是经由分析关键词,取得我们所想要的那一行 。
cut
主要的用途在于将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。 这是因为有时候我们会以某些字符当作分割的参数,然后来将数据加以切割,以取得我们所需要的数据(split操作)。
注意下标从1开始
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20用法:cut [选项]... [文件]...
Print selected parts of lines from each FILE to standard output.
如果没有指定文件,或者文件为"-",则从标准输入读取。
必选参数对长短选项同时适用。
-c, --characters=列表 以字符 (characters) 的单位取出固定字符区间
-d, --delimiter=分界符 后面接分隔字符。与 -f 一起使用
-f, --fields=列表 依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思
# 示例
## 定义一个变量
zuo@zuo-VirtualBox:~$ s='11:22:33:44:55'
# 取 s 第一个字符到第三个字符(闭区间)
zuo@zuo-VirtualBox:~$ echo $s | cut -c 1-3
11:
# 用 ':' 进行分割,取第四个区间
zuo@zuo-VirtualBox:~$ echo $s | cut -d ':' -f 4
44
# 用 ':' 进行分割,取从开头到第三个区段之间所有内容
zuo@zuo-VirtualBox:~$ echo $s | cut -d ':' -f -3
11:22:33grep
grep 是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来。另外注意,Pattern是可以使用正则表达式的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19用法: grep [选项]... PATTERN [FILE]...
Search for PATTERN in each FILE.
Example: grep -i 'hello world' menu.h main.c
-E : 使用扩展的正则表达式
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :显示输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!
# 案例
## 注意Linux中 ? + {} 属于扩展正则表达式,因此需要加上\
zuo@zuo-VirtualBox:~/Sample$ cat src.cpp | grep -n 'void \w\+()'
17: void operate()
## 如果想要直接使用扩展的正则,需要加上参数 -E
zuo@zuo-VirtualBox:~/Sample$ cat src.cpp | grep -E -n 'void \w+\(\)'
17: void operate()