linux 的重定向、管道、xargs 命令
来源:互联网 发布:yahoo 雅虎输入法 mac 编辑:程序博客网 时间:2024/05/21 15:50
原文地址:http://blog.csdn.net/lucky_liuxiang/article/details/70597755
重定向、管道和xargs命令都是在命令之间传递数据的方式。Linux的最初的理念就是KISS,“Keep It Simple, Stupid!”的缩写。命令行命令都只做一样事情,但是要完成得非常出色。给我最深刻印象是tar命令。tar命令的目的只是将几个文件连接在一起组成一个大文件而已。而压缩的程序只能压缩单个文件。肯定有人会有疑问,tar命令的-z和-j之类的参数也可以压缩啊。其实tar本身没有压缩代码,tar是通过调用外部的gzip、bzip2之类的压缩命令来完成工作的。KISS的理念得到了广泛的支持。好多Linux命令都只会做一件事情。而复杂的事情则需要通过各种命令的组合来完成。各命令之间的通信,除了中间临时文件以外,Linux还提供了管道来完成直接的数据传输。重定向可以将标准输入、标准输入或标准错误重定向到文件或设备(这里涉及到Linux另外一条设计理念,就是一切都是文件,设备都是文件)。xargs可以将标准输入的内容转变成命令的命令行参数。
重定向
在讲重定向之前,我想说说什么叫标准输入,标准输出和标准错误。在Linux里,进程间通信(IPC)最基本的一种方法是通过管道(其他还有消息、共享内存等)。管道就像流水线一样,单向的,不用关心管道另外一边是谁。系统给每一个命令行程序默认三条管道与用户交互,就是标准输入,标准输出和标准错误。标准输入指的是用户按键盘给程序输入数据。标准输出是指程序正常打印给用户的信息,是打印到shell上的。标准错误跟标准输出在本质上是相同的,都是输出信息给用户。不同的是,两个管道是分开的,可以用来打印不同种类的信息,比如说标准错误通常用来打印错误信息。因为使用管道不用关心另外一边是谁,所以把管道接到别的地方,程序也不会知道。Linux用了这种特性来实现了管道的重定向。
默认情况,三个默认管道是跟用户交互的。因为在Linux下,每个命令都只做一件事情。有些情况下,用户想让程序跟程序之间交互通过默认管道交互,比如说想把一个命令的输出接到另外一个命令的输入里面。重定向的方法如下:
> filename,重定向标准输出到文件,覆盖文件。
>> filename,重定向标准输出到文件,追加模式。
2> filename,重定向标准错误到文件。
&> filename,重定向标准输入和标准错误到文件。相当于同时使用>和2>。(感谢yszzf友情提供)
< filename,重定向标准输入自文件
举个例子,在用find的时候,有的目录不允许访问,find就输出很多行的错误,真正的搜索结果就看不到了。这时我会把标准错误重定向到空设备去。
1. find / -name "filename" 2> /dev/null
再比如在用gdb进行自动测试的时候,把命令写到一个文件里,然后送入gdb。
1. gdb program < test_script.gdb
管道
管道的原理上面基本介绍清楚了。管道是让用户将不同程序间的标准输入、标准输出连接起来,而不单单是重定向到文件。用法是在命令间用“|”连接起来。
app1 | app2
我最常用的几个情况:
1. 程序输出太多,用less慢慢看。
1. verbose_app | less
2. 在程序输出里面进行搜索。一种方法可以送到less里面在用less搜索。这里用另外一个命令,grep。
verbose_app | grep pattern
# pattern是被搜索的内容。如果有空格,用双引号括起来。如果想使用扩展正则表达式,用grep -E。
3. 因为在重定向了以后,被重定向的管道就不再打印到屏幕了。如果又想打印到文件,又想打印到屏幕,可以用tee命令
verbose_app | tee filename | another_app
xargs
如果后面的程序必须要命令行参数,而不接受管道传参数,就要使用xargs。
1. 先演示一下原理。
echo "arg1 arg2" | xargs app
# 相当于
app arg1 arg2
2. 用find或者ls查找文件,然后将所有文件tar了。
find . -type f | xargs tar -cvzf output.tar.gz
3. 计算源文件行数。这里要用到一个叫wc的命令,是用来计算文件单词数、字符数和行数的。如果管道到wc的话,wc会将数据当做文本来进行计算。文件名只有从命令行传递
find .
# 或者
find . -type f | grep -E "\.[ch](pp)?$" | xargs wc -l
重定向的>,2>,<之类的原理是把标准输入等用新的管道来取代。
我一开始是这样写的
command >/dev/null 2>&1
这样写的问题是,>已经将标准输出用null设备替换了,然后2>&1将标准错误接到“标准输出”上,而“标准输出”现在已经变成了null设备,也就是说标准错误接到了null设备上。
正确的方法是
command 2>&1 >/dev/null
另外,交换标准输出和标准错误:
command 3>&1 1>&2 2>&3
- linux 的重定向、管道、xargs 命令
- linux 的重定向、管道、xargs 命令
- linux 命令之间传递数据的方式:重定向、管道、xargs 命令。
- linux命令温故知新:输入输出重定向/管道
- linux重定向操作符 ( 管道命令 ):|、>、>> 、<、>&、<&
- Linux中>、>>、<、<<重定向及管道命令
- Linux 管道、命令替换、重定向
- 【linux 命令】输入输出重定向及管道
- 【Linux】管道命令符、重定向、环境变量
- Linux管道和命令重定向
- cmd命令的管道重定向
- 通过管道和重定向实现linux管道命令
- 通过管道和重定向实现linux管道命令
- linux重定向、管道
- linux 管道重定向
- linux 重定向 管道
- linux的管道与重定向牛刀小试
- linux的管道及重定向
- snaker简介
- HDOJ1234开门人和关门人
- 频域和时域
- VUE+Webpack 实现懒加载的三种方式
- WIN 10 去除快捷方式BAT
- linux 的重定向、管道、xargs 命令
- Android 蓝牙开发 【一】
- 缄默期过后6小时,搜狗王小川回应一切(他说:会叫的狗不咬人)
- docker安装和部署
- 谷歌推出开源工具DeepVariant,用深度学习识别基因变异
- 彭博无人车报告:全球47城已在路测,“最后一公里”是最强痛点
- 活动报名 | 量子位携搜狐,与行业大咖一同解读AI芯片的前世今生
- sparkmaster端口更改问题
- “不正经”NIPS大会指北:嘻哈歌手、感人长队,以及最佳论文