xargs命令在linux运维开发中的使用

xargs命令在运维开发中使用

在集群运维开发过程中,根据实际开发场景,我们经常会需要大量文件做批处理操作,无论是linux本地上的,还是hdfs上的文件,我们都可以用xargs 命令对其逐一处理。这里xargs命令更多的可以当作是运维开发过程中的一个小工具,快速对批文件做DIY处理,非常灵活。
ref21

xargs 命令

xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具,它是构建单行命令的重要组件之一。xargs的默认命令是echo,空格是默认定界符。

常用功能:

1.输出的数据,逐个接收,并传递出去用其他命令DIY处理
2.将输出的数据格式化再输出,eg:N行变单行,单行变N行,每行M个字符。

基本用法 【-n ,-d ,-I ,-t 】

xargs作为替换工具,读取输入数据重新格式化输出:

	-n
jacky@xingxing myscripts % cat exa.txt
a b c
d e f
g h i
---多行变单行,限于都是单个字符
jacky@xingxingmyscripts % cat exa.txt|xargs
a b c d e f g h i
jacky@xingxing myscripts % cat exa.txt|xargs echo
a b c d e f g h i

---通过-n 指定每行个数,从而控制行数
jacky@xingxing myscripts % cat exa.txt|xargs -n2
a b
c d
e f
g h
i
	-d 【ps:mac不支持-d命令,linux 支持,分隔符】
echo "aaxbbxccxddx" |xargs -dx
aa bb cc dd

	-I  【使用-I 指定一个替换字符串,名字任意取,
	这个字符串在xargs扩展时会被替换掉】
ls ./
a.txt
b.txt
c.txt

ls ./|xargs -I {} mv {} {}.bak
a.bxt.bak
b.txt.bak
c.txt.bak

	-t 【打印执行日志】

xargs结合find使用

我们需要批量删除根据条件过滤出来的文件时,用rm -rf aa bb 
cc ...,系统可能提示参数过多,我们可以用xargs删除
eg:
find . -type -f -name '*.log' -print0 |xargs -0 rm -rf 

find -print0 和xargs -0 原理及用法

上面用到了-print0 和 xargs -0,那么这是什么东西呢?
查找资料ref2,找到了如下解释:

find . -type -f -name ‘*.log’ |xargs rm -rf

find 和xargs 一起使用时,如果这个命令如果遇到文件名里有空格或者换行符,就会出错。因为xargs识别字符段的标识是空格或者换行符,所以如果一个文件名里有空格或者换行符,xargs就会把它识别成两个字符串,自然就出错了。

这时候就需要-print0和-0了。

答疑

find -print0表示在find的每一个结果之后加一个NULL字符,而不是默认加一个换行符。find的默认在每一个结果后加一个’\n’,所以输出结果是一行一行的。当使用了-print0之后,就变成一行了

然后xargs -0表示xargs用NULL来作为分隔符。这样前后搭配就不会出现空格和换行符的错误了。选择NULL做分隔符,是因为一般编程语言把NULL作为字符串结束的标志,所以文件名不可能以NULL结尾,这样确保万无一失。

所以比较我们推荐的比较保险的命令是

find . -type -f -name ‘*.log’ -print0 |xargs -0 rm -rf

统计一个目录下shell 脚本的个数:
find . -type f -name "*.sh" -print0 | xargs -0 wc -l
查找所有的日志文件,并压缩它们:
find . -type f -name "*.log" -print | xargs tar -czvf logs.tar.gz

  1. 参考博客 ↩︎

  2. 参考博客 ↩︎

你可能感兴趣的:(大数据运维,linux)