2010年7月29日 星期四

[Linux 小學堂] 參數代換: xargs

轉載自 這裡 (鳥哥 Linux 私房菜) 
前言 : 
xargs 是在做什麼的呢?就以字面上的意義來看, x 是加減乘除的乘號,args 則是 arguments (參數) 的意思,所以說,這個玩意兒就是在產生某個指令的參數的意思! xargs 可以讀入 stdin 的資料,並且以空白字元或斷行字元作為分辨,將 stdin 的資料分隔成為 arguments 。 因為是以空白字元作為分隔,所以,如果有一些檔名或者是其他意義的名詞內含有空白字元的時候, xargs 可能就會誤判了~他的用法其實也還滿簡單的!就來看一看先! 

使用介紹 : 
語法 : xargs [-0epn] command 

參數 | 說明
-0 | 如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元時,這個 -0 參數可以將他還原成一般字元。這個參數可以用於特殊狀態喔!
-e | 這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到這個字串時,就會停止繼續工作!
-p | 在執行每個指令的 argument 時,都會詢問使用者的意思;
-n | 後面接次數,每次 command 指令執行時,要使用幾個參數的意思。看範例三。

Ps. 當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔! 

使用範例 : 
* 範例一 : 將 /etc/passwd 內的第一欄取出,僅取三行,使用 finger 這個指令將每個帳號內容秀出來 
client:~/src/mk_sample # cut -d':' -f1 /etc/passwd | head -n 3 | xargs finger 
Login: at Name: Batch jobs daemon 
Directory: /var/spool/atjobs Shell: /bin/bash 
Never logged in. 
No Mail. 
No Plan. 
# 由 finger account 可以取得該帳號的相關說明內容,例如上面的輸出就是 finger at 
# 後的結果。在這個例子當中,我們利用 cut 取出帳號名稱,用 head 取出三個帳號. 
# 最後則是由 xargs 將三個帳號的名稱變成 finger 後面需要的參數. 
...(以下省略)... 

* 範例二 : 將所有的 /etc/passwd 內的帳號都以 finger 查閱,但一次僅查閱五個帳號 
client:~/src/mk_sample # cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger 
finger at bin daemon dhcpd ftp ?...y <由鍵盤輸入 y繼續 finger> 
.....(中間省略).... 
finger man messagebus mysql named news ?...y 
...(以下省略)... 
# 在這裡使用了 -p 這個參數來讓您對於 -n 更有概念。一般來說,某些指令後面 
# 可以接的 arguments 是有限制的,不能無限制的累加,此時,我們可以利用 -n 
# 來幫助我們將參數分成數個部分,每個部分分別再以指令來執行!這樣就 OK 啦. 

* 範例三:同上,但是當分析到 games 就結束這串指令. 
client:~/src/mk_sample # head -n 6 /etc/passwd 
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash 
bin:x:1:1:bin:/bin:/bin/bash 
daemon:x:2:2:Daemon:/sbin:/bin/bash 
dhcpd:x:102:65534:DHCP server daemon:/var/lib/dhcp:/bin/false 
ftp:x:40:49:FTP account:/srv/ftp:/bin/bash 
games:x:12:100:Games account:/var/games:/bin/bash 
client:~/src/mk_sample # cut -d':' -f1 /etc/passwd | xargs -p -e'games' finger 
finger at bin daemon dhcpd ftp ?... <因為 games 的前一個是 ftp> 

其實,在 man xargs 裡面就有三四個小範例,您可以自行參考一下內容。 此外, xargs 真的是很好用的一個玩意兒!您真的需要好好的參詳參詳!會使用 xargs 的原因是, 很多指令其實並不支援管線命令,因此我們可以透過 xargs 來提供該指令引用 standard input 之用!舉例來說,我們使用如下的範例來說明: 
* 範例四:找出 /sbin 底下具有特殊權限的檔名,並使用 ls -l 列出詳細屬性 
client:~/src/mk_sample # find /sbin -perm +7000 | ls -l 
# 結果竟然僅有列出 root 所在目錄下的檔案!這不是我們要的! 
# 因為 ll (ls) 並不是管線命令的原因啊! 

client:~/src/mk_sample # find /sbin -perm +7000 | xargs ls -l 
-rwxr-sr-x 1 root shadow 6624 Jun 16 2006 /sbin/unix2_chkpwd 
-rwxr-sr-x 1 root shadow 20136 Jun 16 2006 /sbin/unix_chkpwd 

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...