预备知识

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

results matching ""

    No results matching ""