【Linux】參數代換命令xargs


  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
....(底下省略)....

  參考資料:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#xargs

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM