一、find与xargsjie组合
1、错误的组合方式
find . - type f -name "*.txt" -print | xargs rm -rf
这样做很危险。因为没有办法预测分隔find命令输出结果的定界符是什么(’\n’或者’ ‘),因此xarg是很可能会误认为它们是定界符 (如: hell text.txt 会被xargs误解为 hell 和text.txt)
只要我们把find 输出作为xargs的输入,就必须将 -print0 与find 结合使用,以字符null(’\0’)来分隔输出
2、正确的组合方式
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
xargs -0 将 \0 作为输入定界符.
这样就可以删除所有的txt文件
3、结合stdin运用while语句和子shell
cat all_files_txt.txt | (while read arg;do cat $arg;done)
#等同于 cat all_files_txt.txt | xargs -I {} cat {}
while 循环中,cat $arg 替换成任意数量的命令。
子shell 操作符内部的多个命令可以作为一个整体来运行。
cmd0 | (cmd1;cmd2;cmd3;) |cmd4
如果cmd1是cd/ 那么就会改变子shell 的工作目录,然而这种改变仅限于子shell内部。 cmd4 则完全不知道工作目录发生了变化
二、tr
tr 是Unix命令行专家工具箱中一件简约却不失精美的工具。它经常用来编写优美的单行命
令,作用不容小视。 tr 可以对来自标准输入的内容进行字符替换、字符删除以及重复字符压缩。
它可以将一组字符变成另一组字符,因而通常也被称为转换(translate)命令。
2.1 语法
语法:
tr [options] set1 set2
tr 只能通过stdin(标准输入),而无法通过命令行参数来接受输入。
作用:将来自stdin 的输入字符从set1 映射到set2,然后将输出写入stdout。set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么 set2 会不断重复其最后一个字符,直到长度与 set1 相同。如果 set2 的长度大于 set1 ,那么在 set2 中超出 set1 长度的那部分字符则全部被忽略。
2.2 实例
"HELLO WHO IS THIS 转换为小写
echo "HELLO WHO IS THIS " | tr 'A-Z' 'a-z'
‘ABD-}’ 、 ‘aA.,’ 、 ‘a-ce-x’ 以及 ‘a-c0-9’ 等均是合法的集合。
定义集合也很简单、只需要使用 “起始字符-终止字符”。如果不是一个连续的字符序列,那它就会被视为包含了三个元素的集合。 也就是 起始字符,- 终止字符。
2.3加密、解密实例
#加密 876543
echo 123456 | tr '0-9' '9876543210'
#解密
echo 876543 | tr '9876543210' '0-9'
2.4、ROT13算法演示
加密:
echo “tr came,tr saw,tr conquered.” | tr ‘a-zA-Z’ ‘n-za-mN-ZA-M’
得到输出ge pnzr,ge fnj, ge pbadhrerq.
解密:
echo "ge pnzr,ge fnj, ge pbadhrerq." | 'n-za-mN-ZA-M' tr 'a-zA-Z'
2.5、 tr还可以用来将制表符转换成空格
tr '\t' ' '
2.6、删除字符
-d
语法 cat file.txt | tr -d ‘[set1]’
#只使用set1 ,不使用set2
下图实例删除 字符串 Hello 123 world 456 中的数字
echo "Hello 123 world 456 " | tr -d '0-9'
2.7、字符集补集
c 选项
语法 tr -c [set1] [set2]
set1的补集意味着这个集合中包含set1中没有的所有字符
echo hello 1 char 2 next | tr -d -c '0-9 \n'
#补集 -c '0-9 \n' 表示除数字空格、换行符之外的所有字符
#-d 删除,即删除除数字空格、换行符之外的所有字符
2.8、压缩字符
s 选项 压缩字符
下面删除 "Hello world "多余的空格
echo "Hello world " | tr -s ' '
删除多余的换行符
文本如下
cat mutil_line.txt | tr -s '\n'
结果如下:
2.9 字符类
tr 可以像使用集合一样使用各种不同的字符类,这些字符类如下所示:
alnum :字母和数字。
alpha :字母。
cntrl :控制(非打印)字符。
digit :数字。
graph :图形字符。
lower :小写字母。
print :可打印字符。
punct :标点符号。
space :空白字符。
upper :大写字母。
xdigit :十六进制字符
可以按照下面的方式选择并使用所需的字符类:
tr [:class:] [:class:]
例如:
tr ‘[:lower:]’ ‘[:upper:]’