预备知识
command | xargs
实战演练
- 将多行输入转换成单行输出
[root@shaofeng ~]# cat example.txt
1 2 3 4 5 6
7 8 9 10
11 12
[root@shaofeng ~]# cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
- 将单行输入转换成多行输出
[root@shaofeng ~]# cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12
工作原理
- -d选项为输入指定一个定制的定界符:
[root@shaofeng ~]# echo "splitXsplitXsplitXsplit" | xargs -d X
split split split split
- 结合-n选项,我们可以将输入划分成多行,而每行包含两个参数:
[root@shaofeng ~]# echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
split split
split split
补充内容
读取stdin,将格式化参数传递给命令
- 编写一个小型的定制型echo来更好地理解用xargs提供命令行参数的方法
[root@shaofeng ~]# ./cecho.sh 1 2
1 2 #
[root@shaofeng ~]# cat cecho.sh
#!/bin/bash
echo $* '#'
- 有一个包含着参数列表的文件(每行一个参数)。我需要用两种方法将这些参数传递给一个命令(比如cecho.sh)。第一种方法,需要每次提供一个参数。
[root@shaofeng ~]# cat args.txt | xargs -n 1 ./cecho.sh
arg1 #
arg2 #
arg3 #
- -I {} 指定了替换字符串。
[root@shaofeng ~]# cat args.txt | xargs -I {} ./cecho.sh -p {} -1
-p arg1 -1 #
-p arg2 -1 #
-p arg3 -1 #
结合find使用xargs
- 删除以.txt结尾的文件
[root@shaofeng ~]# find . -type f -name "*.txt" -print0 | xargs -0 rm -f
统计源代码目录中所有.ts文件的行数
➜ src git:(master) ✗ find . -name "*.ts" -print | xargs wc -l
24 ./app/app-routing.module.ts
31 ./app/shared-material/shared-material.module.ts
13 ./app/shared-material/shared-material.module.spec.ts
34 ./app/util/util.ts
31 ./app/app.component.spec.ts
81 ./app/app.module.ts
84 ./app/app.component.ts
49 ./app/env/env-dialog/env-dialog.component.ts
91 ./app/env/env-manager/env-manager.component.ts
41 ./app/auth-services/auth.guard.ts
36 ./app/auth-services/auth.interceptor.ts
40 ./app/bfs/confirm-dialog/confirm-dialog.component.ts
41 ./app/bfs/iv-dialog/iv-dialog.component.ts
70 ./app/bfs/bucket-dialog/bucket-dialog.component.ts
87 ./app/bfs/bfs.service.ts
139 ./app/bfs/groups/groups.component.ts
37 ./app/bfs/av-dialog/av-dialog.component.ts
45 ./app/bfs/ag-dialog/ag-dialog.component.ts
118 ./app/bfs/racks/racks.component.ts
128 ./app/bfs/bucket-manager/bucket-manager.component.ts
15 ./app/bfs/bfs.service.spec.ts
15 ./app/services/aos.service.spec.ts
58 ./app/services/aos.service.ts
15 ./app/services/env.service.spec.ts
17 ./app/services/env.service.ts
12 ./main.ts
3 ./environments/environment.prod.ts
15 ./environments/environment.ts
20 ./test.ts
80 ./polyfills.ts
1470 total
结合stdin,巧妙运用while语句和子shell
- 包含while循环的子shell可以用来读取参数,然后通过一种巧妙的方式执行命令
[root@shaofeng ~]# cat out.txt | (while read arg; do cat $arg; done)
我
❤️
u
[root@shaofeng ~]# cat 1.txt 2.txt 3.txt
我
❤️
u