一、xargs
xargs (exatend argments) 可以将标准输入数据转换成命令行参数。xargs也可以将单行或多行文本输入转换成其他格式。bash 用户都爱单行命令,单行命令是一个命令序列,各命令之间不使用分号,而是使用管道操作符进行联接。xargs 命令应该紧跟在管道操作符之后,以标准输入作为主要的源数据流。它使用stdin 并通过提供命令行参数来执行其他命令。之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数。
1.1、将多行输入转换成单行输出。
将换行符移除,再用 " "(空格)进行替换。
有如下文本:
cat example.txt
cat example.txt | xargs
将上面文档转换为一行,结果如下:
1.2将单行输入转换成多行输出
指定每行最大的参数数量 n 然后将任何来自stdin的文本划分成多行。 空格是默认的定界符。
cat example.txt | xargs -n 3
将文本转换为每行最多三个字符的输出
1.3、-d 选项指定定制的定界符
xargs 默认的定界符是空格或者是换行符
指定定界符为’,’
echo "天苍苍,野茫茫,风吹草低见牛羊" | xargs -d \,
结合-n
echo "天苍苍,野茫茫,风吹草低见牛羊" | xargs -d \, -n 2
1.4、读取stdin,将格式化参数传递给命令
创建如下脚本,脚本作用打印传入脚本的参数
储存参数的文本如下
先需要 执行脚本xargs.sh时传入args.txt中的参数,这里执行脚本时就不支持从stdin中读取数据。
1.4.1、每次只传入一个参数
cat args.txt | xargs -n 1 ./xargs.sh
1.4.2、一次传入所有参数
cat args.txt | xargs ./xargs.sh
1.5、-I 为特定的命令(xargs.sh)提供命令行参数。
再来看如下命令 arg1是唯一可变内容,如何实现从args.txt 中读取 实现如下功能。
./xargs.sh -p arg1 -l
xargs 有一个选项 -I 可以指定替换字符串
先来看如下结果
cat args.txt | xargs -I {} ./xargs.sh -p {} -l
-I 指定了替换字符串 ,对于每一个命令参数 ,字符串{}(这里还可以指定其他合法的字符串, 执行脚本中的{}都会被从stdin读取到的参数替换掉。
注意这里的{}也可以是其他的合法字符串,如指定为replace ,结果跟上面一样
**注意:**这里 -I 也是使用循环方式执行的,这里有三个命令参数,就会循环替换三次
1.6、xargs与find组合
1.6.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’)来分隔输出
1.6.2、正确的组合方式
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
xargs -0 将 \0 作为输入定界符.
这样就可以删除所有的txt文件
1.6 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:]’