现在的位置: 首页 > 综合 > 正文

xargs

2013年11月09日 ⁄ 综合 ⁄ 共 2112字 ⁄ 字号 评论关闭

 

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

 

[root@www ~]# xargs [-0epn] command
選項與參數:
-0  :如果輸入的 stdin 含有特殊字元,例如 `, /, 空白鍵等等字元時,這個 -0 參數
      可以將他還原成一般字元。這個參數可以用於特殊狀態喔!
-e  :這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到
      這個字串時,就會停止繼續工作!
-p  :在執行每個指令的 argument 時,都會詢問使用者的意思;
-n  :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。看範例三。
當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔!

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

範例二:同上,但是每次執行 finger 時,都要詢問使用者是否動作?
[root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger
finger root bin daemon ?...y
.....(底下省略)....
# 呵呵!這個 -p 的選項可以讓使用者的使用過程中,被詢問到每個指令是否執行!

範例三:將所有的 /etc/passwd 內的帳號都以 finger 查閱,但一次僅查閱五個帳號
[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger
finger root bin daemon adm lp ?...y
.....(中間省略)....
finger uucp operator games gopher ftp ?...y
.....(底下省略)....
# 在這裡鳥哥使用了 -p 這個參數來讓您對於 -n 更有概念。一般來說,某些指令後面
# 可以接的 arguments 是有限制的,不能無限制的累加,此時,我們可以利用 -n
# 來幫助我們將參數分成數個部分,每個部分分別再以指令來執行!這樣就 OK 啦!^_^

範例四:同上,但是當分析到 lp 就結束這串指令?
[root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger
finger root bin daemon adm ?...
# 仔細與上面的案例做比較。也同時注意,那個 -e'lp' 是連在一起的,中間沒有空白鍵。
# 上個例子當中,第五個參數是 lp 啊,那麼我們下達 -e'lp' 後,則分析到 lp
# 這個字串時,後面的其他 stdin 的內容就會被 xargs 捨棄掉了!

其實,在 man xargs 裡面就有三四個小範例,您可以自行參考一下內容。 此外, xargs 真的是很好用的一個玩意兒!您真的需要好好的參詳參詳!會使用 xargs 的原因是, 很多指令其實並不支援管線命令,因此我們可以透過 xargs 來提供該指令引用 standard input 之用舉例來說,我們使用如下的範例來說明:

 

 

範例五:找出 /sbin 底下具有特殊權限的檔名,並使用 ls -l 列出詳細屬性
[root@www ~]# find /sbin -perm +7000 | ls -l
# 結果竟然僅有列出 root 所在目錄下的檔案!這不是我們要的!
# 因為 ll (ls) 並不是管線命令的原因啊!

[root@www ~]# find /sbin -perm +7000 | xargs ls -l
-rwsr-xr-x 1 root root 70420 May 25  2008 /sbin/mount.nfs
-rwsr-xr-x 1 root root 70424 May 25  2008 /sbin/mount.nfs4
-rwxr-sr-x 1 root root  5920 Jun 15  2008 /sbin/netreport
....(底下省略)....

    1. 先用 find 去找出檔案;
    2. 用 xargs 將這些檔案每次丟 10 個給 grep 來作為參數處理;
    3. grep 實際開始搜尋檔案內容。

    所以整個作法就會變成這樣:

    [root@www ~]# find / -type f | xargs -n 10 grep '/*'
    
  • 转至:http://linux.vbird.org/

     

     

    抱歉!评论已关闭.