首頁  >  文章  >  運維  >  linux中xargs指令技巧的各種使用詳解

linux中xargs指令技巧的各種使用詳解

黄舟
黄舟原創
2017-05-28 11:39:311661瀏覽

xargs是給指令傳遞參數的一個篩選器,也是組合多個指令的一個工具。以下這篇文章主要為大家介紹了關於linux中xargs指令用法的相關資料,需要的朋友可以參考借鑒,下面來跟著小編一起看看吧。

前言

xargs指令是把接收到的資料重新格式化,再將其作為參數提供給其他指令,以下介紹xargs命令的各種使用技巧,一起來看看吧。

一、將多行輸入轉換成單行輸入:

[root@host1 test]# echo -e "1 2 3 4 5 \n6 7 8 \n9 10 11 12" >example.txt
[root@host1 test]# cat example.txt 
1 2 3 4 5 
6 7 8 
9 10 11 12
[root@host1 test]# cat example.txt |xargs 
1 2 3 4 5 6 7 8 9 10 11 12

將單行輸入轉換成多行輸出:

[root@host1 test]# cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12

自訂定界符轉換(預設的定界符是空格):

[root@host1 test]# echo "Hello:Hello:Hello:Hello" | xargs -d : -n 2
Hello Hello
Hello Hello

#二、在腳本中運用:

[root@host1 test]# cat echo.sh 
#!/bin/bash
echo $* '^-^'

當參數傳遞給echo.sh後,它會將這些參數印出來,並且以"^-^"作為結尾:

[root@host1 test]# echo -e "Tom\nHarry\nJerry\nLucy" > args.txt
[root@host1 test]# cat args.txt | xargs bash echo.sh 
Tom Harry Jerry Lucy ^-^
[root@host1 test]# cat args.txt | xargs -n 2 bash echo.sh 
Tom Harry ^-^
Jerry Lucy ^-^

在上面的例子中,我們把參數來源都放入args.txt文件,但除了這些參數,我們還需要一些固定不變的參數,例如:

[root@host1 test]# bash echo.sh Welcome Tom 
Welcome Tom ^-^

在上述指令執行過程中,Tom是變數 ,其餘部分為常數,我們可以從"args.txt"中提取參數,並按照下面的方式提供給命令:

[root@host1 test]# bash echo.sh Welcome Tom 
[root@host1 test]# bash echo.sh Welcome Herry
[root@host1 test]# bash echo.sh Welcome Jerry
[root@host1 test]# bash echo.sh Welcome Lucy

這時我們需要使用xargs中-I指令:

[root@host1 test]# cat args.txt | xargs -I {} bash echo.sh Welcome {} 
Welcome Tom ^-^
Welcome Harry ^-^
Welcome Jerry ^-^
Welcome Lucy ^-^

-I {} 指定替換字串,對於每個指令參數,字串{}都會被從stdin讀取到的參數取代掉,

使用-I的時候,指令以循環的方式執行,如果有4個參數,那麼指令就會連同{}一起被執行4次,在每一次執行中{}都會被替換為對應的參數。

三、結合find使用

xargs和find是一對非常好的組合,但是,我們通常是以一種錯誤的方式運用它們的,例如:

[root@host1 test]# find . -type f -name "*.txt" -print | xargs rm -f

這樣做是有危險的,有時會刪除不必刪除的文件,如果文件名裡包含有空格符(' '),則xargs很可能認為它們是定界符(例如,file text.txt會被xargs誤認為file和text.txt)。

如果我們想把find的輸出當作xargs的輸入,就必須將-print0與find結合使用以字元null('\0')來分隔輸出,用find找出所有.txt的文件,然後用xargs將這些文件刪除:

[root@host1 test]# find . -type f -name "*.txt" -print0 | xargs -0 rm -f

這樣就可以刪除所有的.txt檔案了,xargs -0 將\0作為輸入定界符。

四、運用while語句和子shell

[root@host1 test]# cat files.txt | (while read arg ;do cat $arg;done)

這條指令等同於:

[root@host1 test]# cat files.txt | xargs -I {} cat {}

while循環中,可以將cat $arg替換成任意數量的命令,這樣我們就可以對同一個參數執行多條命令,也可以不借助管道,將輸出傳遞給其他指令,這個技巧適應多種問題場景。子shell運算子內部的多個指令可作為一個整體來運作。

總結

#

以上是linux中xargs指令技巧的各種使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn