什么是管道
管道命令使用的是 “|” 这个界定符号。“|” 仅能处理经由前面一个指令传来的正确信息,也就是 standard output 的信息,对于 standard error 并没有直接处理的能力。并且管线后面紧接着的指令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。而这样的指令又被称为“管道命令”,例如 less、more、head、tail 等都是可以接受 stdin 的管道命令,而 ls、cp、mv 并不会接受来自 stdin 的数据,因此它们就不是管道命令。
想要 stderr 也可以被管道命令所使用,那么可以通过数据流重导向实现,把 2>&1 加入指令中即可让 2> 变成 1>。
常用管道命令
cut
1 | cut:将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。 |
grep
xargs 参数代换
1 | xargs:产生某个指令的参数。可以读入 stdin 的数据,并且以空白字符或断行字符作为分隔符,将 stdin 的数据分割成 arguments。当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出! |
tee 双向重导向
> 会将整个数据流传送给文件或设备,而这些数据流是无办法使用的。但是我们有时候既希望这些数据流存下来,也希望这些数据流可以被下一条指令再次利用起来,那么我们就可以使用 tee。tee 会同时将数据流送去文件或屏幕,而送到屏幕的数据就可以被下一条指令继续处理了。
1 | tee [-a] file |
split
1 | split:可以将一个大文件依据文件大小或者行数来分区,也就是将大文件分成小文件。 |
sort
1 | sort:根据不同的数据型态(数字与文字)来进行排序,并且排序的字符与语系的编码相关,建议使用 LANG=C 来让语系统一。 |
uniq
1 | uniq: 将重复的行删除掉只显示一个,由于这个指令是在将重复的行减少,所以需要配合排序过的文件来处理。 |
wc
减号 - 的用途
在管道命令中,常常将前一个指令的 stdout 作为这次的 stdin。比如 tar 会用到文件名称来处理,那么在 tar 时就可以使用 - 来代替 stdin 和 stdout。另外,如果需要 stdout/stdin 的时候,但是这时候又没有文件, 有的只是 - 的时候,那么这个 - 就会当成 stdout/stdin。
1 | # 这是使用 tar 打包的一般步骤 |
个人觉得,减号 - 就可以当成一个匿名参数,当整个管道指令执行完成之后又会把这个匿名参数所代表的内容删掉。
tr
1 | tr:可以用来删除一段信息中的内容,或者进行文字内容的替换。tr 这个指令也可以使用正则表达式,因为它也是由正则表达式的方式来取代数据的。 |
col
1 | col:col 有其他特殊的用途,但是很多时候,它可以用来简单将 tab 键取代成为空白键 |
expand
1 | expand:将 tab 键转换为空白键 |
join
1 | join:处理两个文件,将有两个文件中有相同数据的那一行加一起。需要注意的是,在 join 之前,需要处理的文件要先经过 sort 处理,否则有些比对项目将会被略过。 |
paste
1 | paste:join 是需要比对两个文件的相关性,而 paste 是直接将两行粘贴在一起,且中间以 tab 键隔开。 |