管道 |
管道是一種通信機制西采,通常用于進程間的通信(也可通過socket進行網(wǎng)絡(luò)通信)席吴,它表現(xiàn)出來的形式將前面每一個進程的輸出(stdout)直接作為下一個進程的輸入(stdin)蒸绩。
xargs
將前一個命令的輸出作為命令行參數(shù)傳給后面的命令肛捍。
-exec
- 要結(jié)合{};來用, {}表示前面查詢的結(jié)果;結(jié)束符\;這是固定的寫法
- 參數(shù)是一個一個傳遞的,傳遞一個參數(shù)執(zhí)行一次
- 文件名有空格等特殊字符也能處理
標(biāo)準(zhǔn)輸入與管道命令
cat /etc/passwd | grep root
上面的代碼使用了管道命令(|)。管道命令的作用耳高,是將左側(cè)命令(cat /etc/passwd)的標(biāo)準(zhǔn)輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸入,提供給右側(cè)命令(grep root)作為參數(shù)所踊。
因為grep命令可以接受標(biāo)準(zhǔn)輸入作為參數(shù)泌枪,所以上面的代碼等同于下面的代碼。
grep root /etc/passwd
但是秕岛,大多數(shù)命令都不接受標(biāo)準(zhǔn)輸入作為參數(shù)碌燕,只能直接在命令行輸入?yún)?shù),這導(dǎo)致無法用管道命令傳遞參數(shù)继薛。舉例來說修壕,echo命令就不接受管道傳參。
echo "hello world" | echo
上面的代碼不會有輸出遏考。因為管道右側(cè)的echo不接受管道傳來的標(biāo)準(zhǔn)輸入作為參數(shù)慈鸠。
linux常用的可用于管道操作的命令
命令 | 作用 | 實例 |
---|---|---|
cut | 將一段信息的某一段切出來,處理的信息是以行為單位灌具。 | echo $PATH | cut -d ':' -f 3-5 //將path的值按照':'進行分割青团,后取出第3到5個值 |
grep | 分析一行信息,如果有匹配的稽亏,就將該行拿出來壶冒。 | cat /etc/passwd | grep root //列出輸出中帶有root的行 |
sort | 可以依據(jù)不同的數(shù)據(jù)類型進行排序缕题。 | cat /etc/passwd | sort -t ':' -k 3 -n //根據(jù) passwd中每行截歉,按':'分隔符進行分隔后,按照第3個字段使用純數(shù)字的方式進行排序烟零。 |
uniq | 重復(fù)的行只顯示一個 | last | cut -d ' ' -f1 | sort | uniq -c //列出登錄者名字瘪松,并進行排序,進行統(tǒng)一處理锨阿,并計數(shù)宵睦。 |
wc | 統(tǒng)計指定文件中的字節(jié)數(shù)、字?jǐn)?shù)墅诡、行數(shù)壳嚎,并將統(tǒng)計結(jié)果顯示輸出 | cat /etc/man.config | wc //輸出三個數(shù)字,分表代表行末早,字?jǐn)?shù)烟馅,字符數(shù) |
tee | 雙重定向,存到文件/設(shè)備的同時然磷,輸出到屏幕以便繼續(xù)處理 | ls -l / | tee -a file.list | more //把文件目錄輸出到file.list中郑趁,同時用more將其輸出到屏幕 |
xargs與-exec的區(qū)別
- exec是對每個找到的文件執(zhí)行一次命令,除非這單個的文件名超過了幾k姿搜,否則不
會出現(xiàn)命令行超長出報錯的問題寡润。 - 而xargs是把所有找到的文件名一股腦的轉(zhuǎn)給命令捆憎。當(dāng)文件很多時,這些文件名組合成的命
令行參數(shù)很容易超長梭纹,導(dǎo)致命令出錯躲惰。
find . -name '*.txt' -type f | xargs echo begin
xargs將參數(shù)一次傳給echo,即執(zhí)行:echo begin ./xargs.txt ./args.txt
find . -name '*.txt' -type f -exec echo begin {} \;
exec一次傳遞一個參數(shù)变抽,即執(zhí)行:echo begin ./xargs.txt;echo begin ./args.txt
- find | xargs 這種組合在處理有空格字符的文件名時也會出錯礁扮,因為這時執(zhí)行的命令已經(jīng)不知道哪些是分割符、哪些是文件名中的空格瞬沦!
find /path -type f -print0 | xargs -0 rm
find命令有一個特別的參數(shù)-print0太伊,指定輸出的文件列表以null分隔。然后逛钻,xargs命令的-0參數(shù)表示用null當(dāng)作分隔符僚焦。由于分隔符是null,所以處理包含空格的文件名曙痘,也不會報錯芳悲。