linux系統中xargs命令的使用方式

xargs 是給命令傳遞參數的一個過濾器,能夠將管道或標準輸入的數據轉換成參數,默認的命令是 echo,這意味着經過管道傳遞給 xargs 的輸入將會包含換行,不過經過 xargs 的處理,換行將被空格取代。

如何使用xargs命令linux

語法:ide

xargs [OPTIONS] [COMMAND [initial-arguments]]

舉一個例子:咱們用管道符傳輸到xargs,併爲每一個參數運行touch命令,-t表示在執行以前先打印,建立三個文件:spa

[root@localhost ~]# echo "file1 file2 file3"|xargs -t touch
touch file1 file2 file3

如何限制參數的數量orm

默認狀況下,傳遞給命令的參數數量由系統限制決定。-n選項指定要傳遞給命令的參數個數。xargs根據須要屢次運行指定的命令,直到全部參數都用完爲止。ip

下面例子指定每次傳遞一個參數:get

[root@localhost ~]# echo "file1 file2 file3"|xargs -n1 -t touch
touch file1 
touch file2 
touch file3

如何運行多個命令it

要使用xargs運行多個命令,請使用-i或者-I選項。在-i或者-I後面自定義一個傳遞參數符號,全部匹配的項都會替換爲傳遞給xargs的參數。table

下面例子時xargs運行兩條命令,先touch建立文件,而後ls列出來:class

[root@localhost ~]# echo "file1 file2 file3"|xargs -t -I % sh -c 'touch %;ls -l %'
sh -c touch file1 file2 file3;ls -l file1 file2 file3 
-rw-r--r--. 1 root root 0 Jan 30 00:18 file1
-rw-r--r--. 1 root root 0 Jan 30 00:18 file2
-rw-r--r--. 1 root root 0 Jan 30 00:18 file3

如何指定一個分隔符打包

使用-d或者--delimiter選項設置自定義分隔符,能夠是單個字符,也能夠是以開頭的轉義字符。

下面例子使用#作分隔符,echo命令使用了-n選項,意思是不輸出新行:

[root@localhost ~]# echo -n file1#file2#file3#file4|xargs -d \# -t touch
touch file1 file2 file3 file4

如何從文件中讀取條目

xargs命令還能夠從文件讀取條目,而不是從標準輸入讀取條目。使用-a選項,後跟文件名。
建立一個ip.txt的文件,一會使用xargs命令ping裏面的每個地址:

[root@localhost ~]# cat ip.txt 
114.114.114.114
www.linuxprobe.com
202.102.128.68

使用-L 1選項,該選項表示xargs一次讀取一行。若是省略此選項,xargs將把全部ip傳遞給一個ping命令。

[root@localhost ~]# xargs -a ip.txt -t -L 1 ping -c 1
ping -c 1 114.114.114.114 
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=93 time=11.0 ms

--- 114.114.114.114 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 11.026/11.026/11.026/0.000 ms
ping -c 1 www.linuxprobe.com 
PING www.linuxprobe.com.w.kunlunno.com (221.15.65.202) 56(84) bytes of data.
64 bytes from hn.kd.jz.adsl (221.15.65.202): icmp_seq=1 ttl=48 time=20.9 ms

--- www.linuxprobe.com.w.kunlunno.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 20.934/20.934/20.934/0.000 ms
ping -c 1 202.102.128.68 
PING 202.102.128.68 (202.102.128.68) 56(84) bytes of data.
64 bytes from 202.102.128.68: icmp_seq=1 ttl=83 time=8.71 ms

--- 202.102.128.68 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 8.710/8.710/8.710/0.000 ms

xargs與find一塊兒使用

xargs一般與find命令結合使用。您可使用find搜索特定文件,而後使用xargs對這些文件執行操做。

若要避免包含換行符或其餘特殊字符的文件名出現問題,請始終使用find的-print0選項,這樣可使find打印完整的文件名,配合xargs命令使用-0或者--null選項能夠正確的解釋。

下面例子中,查找log文件夾下面的類型爲file的全部文件,打包壓縮起來:

[root@localhost ~]# find log/ -type f -print0|xargs --null tar -zcvf logs.tar.gz
log/anaconda/anaconda.log
log/anaconda/syslog
log/anaconda/program.log
log/anaconda/packaging.log
log/anaconda/storage.log
log/anaconda/ifcfg.log
log/anaconda/ks-script-TOLvJc.log
log/anaconda/ks-script-VRY9yQ.log
log/anaconda/ks-script-pjDijm.log
log/anaconda/journal.log
log/audit/audit.log
log/boot.log
log/boot.log-20200126
log/btmp
log/btmp-20200126
…
[root@localhost ~]# ll
total 604
-rw-------. 1 root root   1285 Dec 21 17:19 anaconda-ks.cfg
drwxr-xr-x. 8 root root   4096 Jan 29 23:02 log
-rw-r--r--. 1 root root 607566 Jan 30 00:58 logs.tar.gz

總結

之因此能用到這個命令,關鍵是因爲不少命令不支持管道符來傳遞參數,xargs能夠解決這個問題,並且使用起來很方便,跟能強大。

相關文章
相關標籤/搜索