每天学一点儿shell:xargs 命令
生活随笔
收集整理的這篇文章主要介紹了
每天学一点儿shell:xargs 命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、標準輸入和管道
- 二、xargs命令的作用
- 三、xargs命令的實例
- 1、創建多個文件目錄
- 2、多行內容變單行輸出
- 3、將內容按照","分隔
- 4、找到所有的txt文件并壓縮
- 5、找到所有的txt文件并刪除(慎用)
- 6、配合ps和kill批量殺掉進程(實用)
- 7、配合cp將文件拷貝到多個目錄(實用)
一、標準輸入和管道
舉一個例子:
[root@hadoop-master test-grep]# cat -n ./file.txt | grep leo1 leo hello2 leo2 hello23 leo3 hello3上面這個例子使用了管道命令(|),管道命令的作用是將左側的命令(cat -n ./file.txt )的標準輸出作為右邊的標準輸入,提供給右邊的命令(grep leo)作為參數。因此上面的代碼等同于如下:
[root@hadoop-master test-grep]# grep -n leo file.txt 1:leo hello 2:leo2 hello2 3:leo3 hello3但是大多數命令都不接收標準輸入作為參數,只能直接在命令行輸入參數,這導致無法用管道命令傳遞參數。
例如下面的語句是沒有任何輸出的
二、xargs命令的作用
xargs命令的作用,是將標準輸入轉為命令行參數。
[root@hadoop-master test-grep]# echo "leo" | xargs echo leoxargs命令格式如下:
xargs [OPTION]... COMMAND INITIAL-ARGS...整整執行的命令是緊跟在xargs后面的COMMAND,接收xargs傳來的參數
例如:
上面這個命令是創建one two three 三個目錄,如果不加xargs會報如下錯誤:
[root@hadoop-master test-grep]# echo "one two three" | mkdir mkdir: 缺少操作數 Try 'mkdir --help' for more information.| -a | file 從文件中讀入作為sdtin |
| -e | flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的標志,當xargs分析到含有flag這個標志的時候就停止。 |
| -p | 當每次執行一個argument的時候詢問一次用戶。 |
| -n | num 后面加次數,表示命令在執行的時候一次用的argument的個數,默認是用所有的。 |
| -t | 表示先打印命令,然后再執行。 |
| -i | 或者是-I,這得看linux支持了,將xargs的每項名稱,一般是一行一行賦值給 {},可以用 {} 代替。 |
| -r | no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不用再去執行了。 |
| -s | num 命令行的最大字符數,指的是 xargs 后面那個命令的最大命令行字符數。 |
| -L | num 從標準輸入一次讀取 num 行送給 command 命令。 |
| -l | 同 -L。 |
| -d | delim 分隔符,默認的xargs分隔符是回車,argument的分隔符是空格,這里修改的是xargs的分隔符。 |
| -x | exit的意思,主要是配合-s使用。。 |
| -P | 修改最大的進程數,默認是1,為0時候為as many as it can ,這個例子我沒有想到,應該平時都用不到的吧。 |
三、xargs命令的實例
1、創建多個文件目錄
[root@hadoop-master test-grep]# echo "one two three" | mkdir遞歸創建多個文件目錄:
[root@hadoop-master dir1]# echo "dir1/20201011 dir2/20201011 dir3/20201011"|xargs mkdir -p2、多行內容變單行輸出
[root@hadoop-master test-grep]# cat file.txt leo hello leo2 hello2 leo3 hello3 hello grep [root@hadoop-master test-grep]# cat file.txt | xargs leo hello leo2 hello2 leo3 hello3 hello grep3、將內容按照","分隔
[root@hadoop-master test-grep]# echo "leo,leo,leo" | xargs -d',' leo leo leo4、找到所有的txt文件并壓縮
[root@hadoop-master test-grep]# find . -type f -name "*.txt" -print | xargs tar -czvf txts.tar.gz ./file.txt ./dir2/file.txt5、找到所有的txt文件并刪除(慎用)
[root@hadoop-master test-grep]# find . -type f -name "*.txt" -print0 | xargs -0 rm -f刪除符合條件的目錄下文件,目錄結構如下,需要刪除時間是20201011下的文件:
[root@hadoop-master dir1]# tree . ├── dir1 │ └── 20201011 ├── dir2 │ ├── 20201011 │ │ └── file2.txt │ ├── 20201012 │ │ └── file2.txt │ └── 20201013 │ └── file2.txt └── dir3└── 20201011└── file.txt命令如下:
[root@hadoop-master dir1]# find . -type f -name "*.txt" -print0 | grep -FzZ '20201011' | xargs -0 rm -f [root@hadoop-master dir1]# tree . ├── dir1 │ └── 20201011 ├── dir2 │ ├── 20201011 │ ├── 20201012 │ │ └── file2.txt │ └── 20201013 │ └── file2.txt └── dir3└── 20201011如果沒有tree命令,可以使用yum下載一個:
[root@hadoop-master dir1]# yum install tree6、配合ps和kill批量殺掉進程(實用)
[root@hadoop-master test-grep]# ps -ef|grep -v 'grep'|grep '測試程序'|awk '{print $2}'|xargs kill -97、配合cp將文件拷貝到多個目錄(實用)
[root@hadoop-master BJ]# echo 20201011 20201012 20201013 | xargs -n 1 cp -v ./test01.txt打印結果:
20201011、20201012、20201013 是三個目錄,。/test01.txt代表需要復制的文件
-n 1 :表示每一個命令行只有一個參數,并且傳給cp命令
cp :表示復制命令
-v:verbose表示將復制過程中的詳細信息顯示出來
當然可以正則匹配目錄和文件名:
[root@hadoop-master dir1]# echo */20201011 | xargs -n 1 cp -v ./*.txt "./file1.txt" -> "dir1/20201011/file1.txt" "./file2.txt" -> "dir1/20201011/file2.txt" "./file1.txt" -> "dir2/20201011/file1.txt" "./file2.txt" -> "dir2/20201011/file2.txt" "./file1.txt" -> "dir3/20201011/file1.txt" "./file2.txt" -> "dir3/20201011/file2.txt"總結
以上是生活随笔為你收集整理的每天学一点儿shell:xargs 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天学一点儿shell:Linux中cr
- 下一篇: 每天学一点儿shell:猜数字游戏