xargs:
该xargs出场了,它擅长将标准输入数据转换成命令行参数。 xargs能够处理stdin并将其转换为特定命令的命令行参数。xargs也可以将单行或者多行文本输入转换为其他格式,例如单行变多行,多行变单行。
例1:将多行输入转换成单行输出。
将单行输入转换成多行输出。
指定每行最大的参数数量n,我们可以将任何来自stdin的文本划分成多行,每行n个参数。每一行参数都是由" "隔开的字符串。空格是默认的定界符。下面的方法可以将单行划分成多行:
来看看 xargs的其他用法:
(1):可以用自己的定界符来分割参数。用-d 选项为输入指定一个定制的定界符:
在上面的代码中,stdin是一个包含了多个X字符的字符串。我们可以用-d 将X作为输入定界符。在这里,我们明确指定X作为输入定界符,而在默认情况下 , xargs默认采用内部字段分割(空格) 作为定界符。
再结合-n选项,我们可以将输入划分成多行,而每行包含2个参数:
(2):将格式化或者自定义的参数传递给脚本:
首先写一个简单的脚本 cecho.sh,它的作用是将命令行参数打印出来,并以#字符打印出来作为结尾,脚本如下:
#!/bin/bash
echo $* '#'
我们尝试运行它:
正是我们预期的结果。假如 有一个包含着参数列表的文件args.txt(每行一个参数)。我们需要用两种将这些参数传递给一个命令(cecho.sh)。第一种方法,需要每次提供一个参数:
./ cecho.sh args1
./ cecho.sh args2
./ cecho.sh args3
或者,每次需要提供两个或三个参数。提供三个参数是,它看起来像这样:
./ cecho.sh arg1 arg2
./ cecho.sh arg3
第二种方法,需要一次性提供所有的命令参数:
./cecho.sh arg1 arg2 arg3
上面的问题也可以用xargs来解决,我们有一个名为args.txt的参数列表文件,这个文件内容如下:
就第一个问题,我们可以将这个命令执行多次,每次使用一个参数:
每次执行需要X个参数的命令时,使用:
INPUT |xargs -n X
例如:
就第二个问题,为了在执行命令是一次性提供所有的参数,可以使用:
(3):结合find 使用 xargs
例1:
用find匹配并列出所有".txt"文件,然后用xargs将这些文件删除:
$ find . -type f -name "*.txt" -print0 | xargs -0 rm -f
这样就可以删除所有.txt文件。xargs -0将 \0作为输入定界符。
例2:
统计所有C程序文件的行数,是大多数程序员都会遇到的任务,完成这项任务的代码:
$ find source_code_dir_path -type f -name "*.c" -print0 |xargs -0 wc -l
先到这。下一次学习命令tr的详细操作。。