日期:2014-05-16  浏览次数:20902 次

Linux的数据流重导向,和管线命令

数据流重导向(redirect)

名称 简称 代码 使用方式
标准输入(standard input) stdin 0

<,将文件的数据作为其他命令的输入

<<,设定输入结束的字符串?

标准输出(standard output) stdout 1

>,覆盖方式将正确的数据输出

>>,累加方式将正确的数据输出

标准错误输出(standard error output) stderr 2

2>,覆盖方式将错误的数据输出

2>>,累加方式将错误的数据输出

数据流重导向,可以将命令的stdout或stderr分别输出到其他的文件或设备中去。

也可以将文件或设备作为stdin输入,作为命令的输入。

?

多条命令的执行顺序

$?代表命令执行结果,其值为0表示成功。

cmd1;cmd2 分号两边的命令没有相关性,只是按顺序执行
cmd1&&cmd2

1若cmd1执行完毕且正确执行($?=0),则执行cmd2

2若cmd1执行完毕且为错误($?<>0),则不执行cmd2

cmd1||cmd2

1若cmd1执行完毕且正确执行($?=0),则不执行cmd2

2若cmd1执行完毕且为错误($?<>0),则执行cmd2

cmd1&&cmd2||cmd3

1若cmd1的($?=0),则执行cmd2

2若cmd1的($?<>0),则执行cmd3

?

管线命令(pipe)

cmd1|cmd2 ? cmd1的stdout,作为cmd2的stdin

管线命令仅会处理stdout,对于stderr会予以忽略

管线命令必须能够接受前一个命令的数据成为stdin继续处理才行,也就是说cmd2是有限制的

?

具体管线命令

cut 从每行中,取出符合条件的部分
grep

在一行中,若有符合条件的部分,则输出此行。

支持正则表达式。

sort 对文件中的多行进行排序
uniq 若有重复的多行,只输出第一个
wc 统计文件中的行,单词,字符,字节的数量
tee 从stdin读取,并同时输出到stdout和文件
tr 替换或删除一段文字
col tab转换成多个空格,或man page转换为文本
join 将两个文件中相同数据的两行,连接成一行
paste 直接将两个文件的两行,合并成一行,并以tab分割
expand 将tab转换成空格
split

将一个大文件分割成几个小文件

可用 cat pieces* >> file 来恢复

xargs

从stdin中,以空格或换行来分割出多个参数,给其他命令

许多命令不支持管线,可以通过xargs提供参数

?

减号- ? 代表stdin或stdout

将/home里面的文件都打包,打包的数据输出到stdout,第一个“-”代表stdout。

经过管线后,解压包的数据从stdin而来,第二个“-”代表stdin

$ tar -cvf - /home | tar -xvf -

?

?

?

?