10-管道

基本概念

管道命令指的是将前面一个命令的输出结果,传递给后面一个命令,这样就可以起到对一个命令进行层层筛选过滤的作用。它使用|符号作为定界符。这个管道命令|仅能处理经由前面一个命令传来的正确信息,也就是 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:33
  • grep

    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()