【shell&bash进阶系列】(十七)SHELL脚本--tr、cut、uniq、read命令详解

SHELL脚本--tr命令用法和特性全解

1.1 简介

tr主要用于将从标准输入读取的数据进行结果集映射、字符压缩和字符删除。它首先会将读取的标准输入进行排序然后按照某种方式换行,然后再根据给出的命令行参数做相关处理。

tr [options] [SET1] [SET2]

-c:使用SET1的补集
-d:删除字符
-s:压缩字符
-t:截断SET1,使得SET1的长度和SET2的长度相同

1.2 tr映射

如果同时指定了SET1和SET2,则是将SET1的符号按位置一一对应映射为SET2中的符号。换句话说,就是对应替换。

tr接收到stdin后首先会把将结果按照某种标记符号进行换行。例如:


[root@xuexi tmp]# ls              # 其中"one space.log"是带有空格的文件名
a  b  c  d  logdir  one  one space.log  shdir  sh.txt  space.log  test  vmware-root

将空格替换为制表符。因为tr一接收到数据就进行了排序换行,所以结果仅只替换了"one space.log"中的空格。


[root@xuexi tmp]# ls | tr " " "\t"     # 结果是排序后换行的
a
b
c
d
logdir
one
one    space.log
shdir
sh.txt
space.log
test
vmware-root

之所以说tr是映射而不是替换,是因为两个结果集替换的时候符号位置是一一对应的。如果SET1比SET2短,则SET2多余的部分会被忽略,如果SET1比SET2长,POSIX认为这是不合理的,但也能执行,只不过结果有些意料之外,见下文。例如下面的例子,因为SET1中只有一个符号"\n",于是替换时SET2中的Y被忽略。


[root@xuexi tmp]# ls | tr "\n" "XY" 
aXbXcXdXlogdirXoneXone space.logXshdirXsh.txtXspace.logXtestXvmware-rootX

这样就可以实现简单的加密和解密。


[root@xuexi tmp]# echo "12345" | tr "0-9" "9876543210"     # 加密
87654
[root@xuexi tmp]# echo "87654" | tr "0-9" "9876543210"     # 解密
12345

上面的过程是将管道左边的12345对应到0-9的展开式0123456789,并将对应位映射到SET2的数字上。解密也是同理。

有一种ROT13加密算法,它的加密和解密使用一套字符。它的SET1的字母位和SET2的字母位完全反向成对。例如SET1指定符号是"axy",如果SET2想将其对应为"opq",则须将SET1扩展为"axyopq",SET2扩展为"opqaxy",最终是(a,x,y,o,p,q)和(o,p,q,a,x,y),这样(a,o)和(o,a)就能成功配对。再将其扩展为A-Z和a-z,就是所谓的ROT13加密,甚至还可以将0-9也加上去和9-0对应。下面是SET1和SET2的对应式。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

现在加密“I love you”


[root@xuexi tmp]# echo "I love you" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm" 
V ybir lbh

将“V ybir lbh”解密。


[root@xuexi tmp]# echo "V ybir lbh" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"
I love you

1.3 完全对应的替换

默认情况下,当指定的SET1比SET2字符长时,从最后一个对应的位置开始,SET1的剩余字符都和SET2的最后一个字符对应。假如SET1=[1234],SET2=[abc],则3对应c,4也对应c,此时如果tr的操作对象中出现3或者4都会被替换为c。

使用-t可以先截断SET1比SET2中长的字符,例如上面截断多余的4,SET1=[123]和SET2=[abc]就实现了完全对应。


[root@xuexi tmp]# cat x.txt
NO Name SubjectID Mark 备注
1  longshuai 001  56 不及格
2  gaoxiaofang  001 60 及格
3  zhangsan 001 50 不及格
4  lisi    001   80 及格
5  wangwu   001   90 及格
[root@xuexi tmp]# cat x.txt | tr  "fang" "jin"   # 结果中n和g都被替换为了n
NO Nime SubjectID Mirk 备注
1  lonnshuii 001  56 不及格
2  nioxiiojinn  001 60 及格
3  zhinnsin 001 50 不及格
4  lisi    001   80 及格
5  winnwu   001   90 及格
[root@xuexi tmp]# cat x.txt | tr -t "fang" "jin"  # g被截断,只对应替换fan为jin
NO Nime SubjectID Mirk 备注
1  longshuii 001  56 不及格
2  gioxiiojing  001 60 及格
3  zhingsin 001 50 不及格
4  lisi    001   80 及格
5  w
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值