管道,首次看到这个名词,我并不能将他和os还有shell联系到一起。很难想象这么机械化的一个词语居然能和编程联系起来,而且他还是shell编程中比较重要的一环。
bash命令执行的时候偶输出的数据会出现。那么如果这群数据必须要经过几道手续才能得到我们想要的格式,此时就要需要用到“|”这个界定符号了。管道命令与连续命令是不一样的。简单举个例子:
ls -al /etc | less
即可利用less的功能,我们就能前后翻动相关的信息了。
整体的管道命令可以用以下这个图表示:
在每个管道后面接的第一个数据一定是“命令”,而且这个命令必定要能接受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
把数据流的处理过程中将某段信息存下来,如图:
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,因此我们就不需要使用文件了。