linux 的重定向、管道、xargs 命令
原文地址: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 . ?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>,<之類的原理是把標準輸入等用新的管道來取代。
我一開始是這樣寫的
command >/dev/null 2>&1
這樣寫的問題是,>已經將標準輸出用null設備替換了,然后2>&1將標準錯誤接到“標準輸出”上,而“標準輸出”現在已經變成了null設備,也就是說標準錯誤接到了null設備上。
正確的方法是
command 2>&1 >/dev/null
另外,交換標準輸出和標準錯誤:
command 3>&1 1>&2 2>&3
總結
以上是生活随笔為你收集整理的linux 的重定向、管道、xargs 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grep awk sed 实例
- 下一篇: linux中正则表达式、find、xar