linux 的重定向、管道、xargs 命令
原文地址:http://blog.csdn.net/lucky_liuxiang/article/details/70597755
重定向、管道和xargs命令都是在命令之間傳遞數(shù)據(jù)的方式。Linux的最初的理念就是KISS,“Keep It Simple, Stupid!”的縮寫。命令行命令都只做一樣事情,但是要完成得非常出色。給我最深刻印象是tar命令。tar命令的目的只是將幾個(gè)文件連接在一起組成一個(gè)大文件而已。而壓縮的程序只能壓縮單個(gè)文件。肯定有人會有疑問,tar命令的-z和-j之類的參數(shù)也可以壓縮啊。其實(shí)tar本身沒有壓縮代碼,tar是通過調(diào)用外部的gzip、bzip2之類的壓縮命令來完成工作的。KISS的理念得到了廣泛的支持。好多Linux命令都只會做一件事情。而復(fù)雜的事情則需要通過各種命令的組合來完成。各命令之間的通信,除了中間臨時(shí)文件以外,Linux還提供了管道來完成直接的數(shù)據(jù)傳輸。重定向可以將標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸入或標(biāo)準(zhǔn)錯(cuò)誤重定向到文件或設(shè)備(這里涉及到Linux另外一條設(shè)計(jì)理念,就是一切都是文件,設(shè)備都是文件)。xargs可以將標(biāo)準(zhǔn)輸入的內(nèi)容轉(zhuǎn)變成命令的命令行參數(shù)。
重定向
在講重定向之前,我想說說什么叫標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。在Linux里,進(jìn)程間通信(IPC)最基本的一種方法是通過管道(其他還有消息、共享內(nèi)存等)。管道就像流水線一樣,單向的,不用關(guān)心管道另外一邊是誰。系統(tǒng)給每一個(gè)命令行程序默認(rèn)三條管道與用戶交互,就是標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。標(biāo)準(zhǔn)輸入指的是用戶按鍵盤給程序輸入數(shù)據(jù)。標(biāo)準(zhǔn)輸出是指程序正常打印給用戶的信息,是打印到shell上的。標(biāo)準(zhǔn)錯(cuò)誤跟標(biāo)準(zhǔn)輸出在本質(zhì)上是相同的,都是輸出信息給用戶。不同的是,兩個(gè)管道是分開的,可以用來打印不同種類的信息,比如說標(biāo)準(zhǔn)錯(cuò)誤通常用來打印錯(cuò)誤信息。因?yàn)槭褂霉艿啦挥藐P(guān)心另外一邊是誰,所以把管道接到別的地方,程序也不會知道。Linux用了這種特性來實(shí)現(xiàn)了管道的重定向。
默認(rèn)情況,三個(gè)默認(rèn)管道是跟用戶交互的。因?yàn)樵?/span>Linux下,每個(gè)命令都只做一件事情。有些情況下,用戶想讓程序跟程序之間交互通過默認(rèn)管道交互,比如說想把一個(gè)命令的輸出接到另外一個(gè)命令的輸入里面。重定向的方法如下:
> filename,重定向標(biāo)準(zhǔn)輸出到文件,覆蓋文件。
>> filename,重定向標(biāo)準(zhǔn)輸出到文件,追加模式。
2> filename,重定向標(biāo)準(zhǔn)錯(cuò)誤到文件。
&> filename,重定向標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)錯(cuò)誤到文件。相當(dāng)于同時(shí)使用>和2>。(感謝yszzf友情提供)
< filename,重定向標(biāo)準(zhǔn)輸入自文件
舉個(gè)例子,在用find的時(shí)候,有的目錄不允許訪問,find就輸出很多行的錯(cuò)誤,真正的搜索結(jié)果就看不到了。這時(shí)我會把標(biāo)準(zhǔn)錯(cuò)誤重定向到空設(shè)備去。
1.?find / -name "filename" 2> /dev/null
再比如在用gdb進(jìn)行自動測試的時(shí)候,把命令寫到一個(gè)文件里,然后送入gdb。
1.?gdb program < test_script.gdb
管道
管道的原理上面基本介紹清楚了。管道是讓用戶將不同程序間的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出連接起來,而不單單是重定向到文件。用法是在命令間用“|”連接起來。
app1 | app2
我最常用的幾個(gè)情況:
1. 程序輸出太多,用less慢慢看。
1.?verbose_app | less
2. 在程序輸出里面進(jìn)行搜索。一種方法可以送到less里面在用less搜索。這里用另外一個(gè)命令,grep。
verbose_app | grep pattern
# pattern是被搜索的內(nèi)容。如果有空格,用雙引號括起來。如果想使用擴(kuò)展正則表達(dá)式,用grep -E。
3. 因?yàn)樵谥囟ㄏ蛄艘院?#xff0c;被重定向的管道就不再打印到屏幕了。如果又想打印到文件,又想打印到屏幕,可以用tee命令
verbose_app | tee filename | another_app
xargs
如果后面的程序必須要命令行參數(shù),而不接受管道傳參數(shù),就要使用xargs。
1. 先演示一下原理。
echo "arg1 arg2" | xargs app
# 相當(dāng)于
app arg1 arg2
2. 用find或者ls查找文件,然后將所有文件tar了。
find . -type f | xargs tar -cvzf output.tar.gz
3. 計(jì)算源文件行數(shù)。這里要用到一個(gè)叫wc的命令,是用來計(jì)算文件單詞數(shù)、字符數(shù)和行數(shù)的。如果管道到wc的話,wc會將數(shù)據(jù)當(dāng)做文本來進(jìn)行計(jì)算。文件名只有從命令行傳遞
find . ?name"?.c"?o?name"?.h"?o?name"?.cpp"?o?name"?.hpp" -type f | xargs wc -l
# 或者
find . -type f | grep -E "\.[ch](pp)?$" | xargs wc -l
重定向的>,2>,<之類的原理是把標(biāo)準(zhǔn)輸入等用新的管道來取代。
我一開始是這樣寫的
command >/dev/null 2>&1
這樣寫的問題是,>已經(jīng)將標(biāo)準(zhǔn)輸出用null設(shè)備替換了,然后2>&1將標(biāo)準(zhǔn)錯(cuò)誤接到“標(biāo)準(zhǔn)輸出”上,而“標(biāo)準(zhǔn)輸出”現(xiàn)在已經(jīng)變成了null設(shè)備,也就是說標(biāo)準(zhǔn)錯(cuò)誤接到了null設(shè)備上。
正確的方法是
command 2>&1 >/dev/null
另外,交換標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤:
command 3>&1 1>&2 2>&3
總結(jié)
以上是生活随笔為你收集整理的linux 的重定向、管道、xargs 命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grep awk sed 实例
- 下一篇: linux中正则表达式、find、xar