管道,首次看到这个名词,我并不能将他和os还有shell联系到一起。很难想象这么机械化的一个词语居然能和编程联系起来,而且他还是shell编程中比较重要的一环。
bash命令执行的时候偶输出的数据会出现。那么如果这群数据必须要经过几道手续才能得到我们想要的格式,此时就要需要用到“|”这个界定符号了。管道命令与连续命令是不一样的。简单举个例子:

ls -al /etc | less

即可利用less的功能,我们就能前后翻动相关的信息了。

整体的管道命令可以用以下这个图表示:

ansible shell 管道符_shell 

在每个管道后面接的第一个数据一定是“命令”,而且这个命令必定要能接受STANDARD input的数据才可以,这样的命令才是“管道命令”。例如:less,more,head,tail等才是可以接受标准输入的管道命令,而像ls,cp,mv等就不行。
注意

  • 管道命令仅会处理standard input,对于standard error output会予以忽略。
  • 管道命令必须要能接收来自前一个命令的数据成为standard input 继续处理才行。

1.选取命令:cut,grep

cut 主要的用途在于将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。这是因为有时候我们会以某些字符当作切割的参数,然后将数据加以切割,以取得我们所需要的数据。不过,cut在处理多空格的相连的数据时会比较吃力一些

cut -d'分隔字符' -ffilelds <==用于分隔字符
cut-c 字符范围               <==用于排列整齐的信息
export  | cut -c 12-     <==输出第12字符以后的所有字符
last

gerp是分析一行信息,若当中有我们需要的信息,就将该行拿出来。
语法

grep [-acinv] [--color=zuto] '查找字符串' filename
-a :将binary文件以text文件的方式查找数据;
-c:计算找到‘查找字符串的次数
-i:忽略大小写的不同
-n:顺便输出行号
-v:反向选择,即显示出没有‘查找字符串’的那一行
--color=auto:可以将找到的关键字部分加上颜色显示。

2.排序命令:sort,wc,uniq

sort依据不同的数据类型来进行排序。

语法:

sort [-fbMnrtuk] [file or stadin]
参数:
-f;忽略大小写的差异
-b:忽略最前面的空格符部分
-M:以月份的名字来排序
-n:使用“纯数字”进行排序
-r:反向排序;
-u:就是uniq,相同的数据中,仅出现一行代表
-t:分隔符,默认是用【tab】键来分隔
-k:以那个区间(field)来进行排序的意思
cat /etc/passwd | sort

uniq

重复的数据仅列出一个

uniq [-ic]
-i:忽略大小写字符的不同
-c:进行计数

wc

想知道一个文件里面到底有多少字?多少行?多少字符?就可以使用这个命令。

wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
如果没有参数,三个数字代表的是行,字数,字符数

3.双向重定向:tee

把数据流的处理过程中将某段信息存下来,如图:

ansible shell 管道符_pipe_02

tee [-a] file 
-a 以累加的方式,将数据加入到file中

字符转换命令:tr,col,join,paste,expand

tr

可以用来删除一段信息当中的文字,或者是进行文字信息的替换

tr [-ds]set1...
参数:
-d:删除信息中的set1这个字符串
-s:替换掉重复的字符
不加参数是替换

这个命令可以写在正则表达式中。

col

col [-xb]
参数:
-x:将tab键转换成对等的空格键
-b:将文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符

col经常被利用于将man page 转存为纯文本文件以方便查阅的功能

join

主要是将两个文件当中的有相同数据的那一行加在一起。

join [-ti12] file1 file2
参数:
-t:join默认以空格符分隔数据,并且对比“第一个字段”的数据,如果两个文件相同,则将两条数据连成一行,且第一个字段放在第一个
-i:忽略大小写
-1:代表第一个文件要用哪个字段来分析的意思
-2:代表第二个文件要用哪个字段来分析的意思

注意
在使用join之前,你所需要处理的文件应该要事先经过排序(sort)处理

paste

相对与join必须要对比两个文件的数据相关性,paste就直接将两行贴在一起,且中间以【
tab】键隔开而已

paste [-d] file1 file2
参数:
-d:后面可以接分隔字符,默认是以[tab]来分隔的
- :如果file部分写成- ,表示来自standard input的数据的意思

expand

将tab转换成空格键

expand [-t] file 
参数:
-t:后面可以接数字,一般来说,一个tab键可以用8个空格键代替,我们也可以自行定义一个tab键代表多少个空格。

切割命令:spilt

spilt [-bl] file PREFIX
参数:
-b:后面可接切割成的文件的大小,可加单位,例如b,k,m等。
-l:以行数来进行切割。
PREFIX:代表前导符,可作为切割文件的前导文字

参数代换:xargs

产生某个命令的参数的意思

xargs [-0epn] command
参数:
-0:如果输入的stdin含有特殊字符,例如`,\,空格键等字符时,这个参数可以将它还原成一般字符,这个参数可以用于特殊状态。
-e:这个是EOF(end of file)的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止继续工作。
-p:在执行每个命令的参数时,都会询问用户的意思。
-n:后面接 次数,每次command命令执行时,要使用几个参数的意思。
  • 使用xargs的原因是,很多命令不支持管道命令,我们可以通过xargs来提供该命令引用standard input之用。

减号“-”的作用

tar -cvf - /home |tar -xvf -

这个例子的意思是将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout;经过管道后,将tar-cvf-/home传送给后面的tar-xvf-。后面的这个-则是取用前一个命令的stdout,因此我们就不需要使用文件了。