Linux 基礎教程 42-xargs命令
阿新 • • 發佈:2018-08-28
src 分享 標準輸出 localhost 交換 增加 xargs echo tin
? ? xargs是execute arguments的縮寫,主要作用是從標準輸入中讀取內容,並將此內容傳遞給它要協助的命令,並作為要協助命令的參數來執行。
基本語法
xargs [選項] [命令]
其常用選項如下:
選項 | 說明 |
---|---|
--null ,-0 | 允許將NULL作為分隔符 |
-a file | 從文件讀取項而非標準輸入 |
-d delim | 指定分隔符 |
-p ,--interactive | 交換模式,在執行命令,需要用戶確認是否執行 |
-n max-args | 用於指定每次傳遞多少個參數給其後面的命令 |
-E eof-str | 指定命令結束標識符 |
-e eof-str | 同 -E eof-str |
-i {replace-str} | 將replace-str替換為從標準輸入裏讀入的名稱 |
-I {replace-str} | 功能同-i {replace-str} |
與管道的區別
我們先來看看兩個例子:
- 示例1
[root@localhost ~]# cat test.txt
this is test text.
[root@localhost ~]# echo test.txt | cat
test.txt
[root@localhost ~]# echo test.txt | xargs cat
this is test text.
- 示例2
[root@localhost ~]# echo "--help" | cat --help [root@localhost ~]# echo "--help" | xargs cat 用法:cat [選項]... [文件]... 將[文件]或標準輸入組合輸出到標準輸出。 -A, --show-all 等於-vET -b, --number-nonblank 對非空輸出行編號 -e 等於-vE -E, --show-ends 在每行結束處顯示"$" -n, --number 對輸出的所有行編號 -s, --squeeze-blank 不輸出多行空行 -t 與-vT 等價 -T, --show-tabs 將跳格字符顯示為^I -u (被忽略) -v, --show-nonprinting 使用^ 和M- 引用,除了LFD和 TAB 之外
從上面的例子,我們可以總結如下結論:
- 管道可以實現將前面的標準輸出作為後面命令的標準輸入
- 管道無法實現將前面的標準輸出作為後面命令的命令參數
在Linux中的很多命令都是可以先從命令行參數中獲取參數,然後從標準輸入讀取,最後通過標準輸出顯示結果。而如果想要實現將前面的標準輸出做為後面命令的命令參數,則需要使用命令xargs
示例用法
1、-d選項
[root@localhost ~]# echo ‘2018-08-11‘ | xargs echo 2018-08-11 [root@localhost ~]# echo ‘2018-08-11‘ | xargs -d ‘-‘ echo 2018 08 11
2、-p選項
[root@localhost ~]# echo ‘2018-08-11‘ | xargs -d ‘-‘ -p echo
echo 2018 08 11
?...y
2018 08 11
3、-n選項
[root@localhost ~]# echo ‘2018-08-11‘ | xargs -d ‘-‘ -n 1 echo
2018
08
11
上述示例中表示xargs每次僅從標準輸入傳遞一個參數給後面的命令,被分隔後的參數為3個,因此顯示為3行。
4、-E選項
[root@localhost ~]# echo ‘2018 08 11‘ | xargs -E ‘08‘ echo
2018
[root@localhost ~]# echo ‘2018-08-11‘ | xargs -d ‘-‘ -E ‘08‘ echo
2018 08 11
當xargs解析出多個命令行參數時,如果搜索到-E指定的命令行參數,則終止並退出。需要註意的是 -E 參數只有在不指定 -d 的時候才有效
5、-0選項
-0 選項表示以‘\0‘為分隔符,一般常與find結合使用
[root@localhost test]# find . -name ‘*.txt‘
./1.txt
./2.txt
./3.txt
./4.txt
./test.txt
# 默認情況find的結果中每條記錄中會添加一個換行符
[root@localhost test]# find . -name ‘*.txt‘ -print0
./1.txt./2.txt./3.txt./4.txt./test.txt
# print0表示顯示的輸出結果後面增加‘\0‘而不是換行符
[root@localhost test]# find . -name ‘*.txt‘ -print0 | xargs -0 echo
./1.txt ./2.txt ./3.txt ./4.txt ./test.txt
[root@localhost test]# find . -name ‘*.txt‘ -print0 | xargs -d ‘\0‘ echo
./1.txt ./2.txt ./3.txt ./4.txt ./test.txt
# xargs中的-0和-d ‘\0‘表示從標準輸入讀取內容以‘\0‘進行分隔,因find的結果中是以‘\0‘進行分隔,所以xargs使用‘\0‘將find的結果分隔之後得到5個參數,而且參數中間有空格做為間隔。
6、-i選項
[root@localhost test]# find ./ -name ‘*.txt‘ | xargs -i cp {} /tmp/temp/
[root@localhost test]# ll /tmp/temp/
總用量 20
-rw-r--r-- 1 root root 6 8月 12 00:10 1.txt
-rw-r--r-- 1 root root 6 8月 12 00:10 2.txt
-rw-r--r-- 1 root root 6 8月 12 00:10 3.txt
-rw-r--r-- 1 root root 6 8月 12 00:10 4.txt
-rw-r--r-- 1 root root 19 8月 12 00:10 test.txt
7、-I選項
[root@localhost test]# find ./ -name ‘*.txt‘ | xargs -I {} -i cp {} /tmp/temp/
[root@localhost test]# ll /tmp/temp/
總用量 20
-rw-r--r-- 1 root root 6 8月 12 00:14 1.txt
-rw-r--r-- 1 root root 6 8月 12 00:14 2.txt
-rw-r--r-- 1 root root 6 8月 12 00:14 3.txt
-rw-r--r-- 1 root root 6 8月 12 00:14 4.txt
-rw-r--r-- 1 root root 19 8月 12 00:14 test.txt
-i和-I選項的區別如下所示:
- -i:直接用{}就能替換管道之前的標準輸出中的內容
- -I:需要事先指替換符
本文同步在微信訂閱號上發布,如各位小夥伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下面的二維碼添加關註:
Linux 基礎教程 42-xargs命令