1. 程式人生 > >xargs命令詳解

xargs命令詳解

文件名 過程 介紹 pri .sh 例如 接收 替換字符 welcom

xargs命令是把接收到的數據重新格式化,再將其作為參數提供給其他命令,下面介紹xargs命令的各種使用技巧

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

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

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

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

自定義定界符進行轉換(默認的定界符是空格):

[[email protected] test]# echo "Hello:Hello:Hello:Hello" | xargs -d : -n 2
Hello Hello
Hello Hello

二、在腳本中運用:

[[email protected] test]# cat echo.sh 
#!/bin/bash
echo $* ‘^-^‘
當參數傳遞給echo.sh後,它會將這些參數打印出來,並且以"^-^"作為結尾:
[[email protected]
/* */ test]# echo -e "Tom\nHarry\nJerry\nLucy" > args.txt [[email protected] test]# cat args.txt | xargs bash echo.sh Tom Harry Jerry Lucy ^-^ [[email protected] test]# cat args.txt | xargs -n 2 bash echo.sh Tom Harry ^-^ Jerry Lucy ^-^

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

[[email protected] test]# bash echo.sh  Welcome Tom 
Welcome Tom ^-^

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

[[email protected] test]# bash echo.sh  Welcome Tom 
[[email protected] test]# bash echo.sh  Welcome Herry
[[email protected] test]# bash echo.sh  Welcome Jerry
[[email protected] test]# bash echo.sh  Welcome Lucy

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

[[email protected] 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是一對非常好的組合,但是,我們通常是以一種錯誤的方式運用它們的,比如:

[[email protected] 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將這些文件刪除:

[[email protected] test]# find . -type f -name "*.txt" -print0 | xargs -0 rm -f

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

  

xargs命令詳解