摘自 Linux Shell 脚本攻略 第二章 命令之乐
tr
tr可以对 来自标准输入的内容进行字符替换、字符删除以及重复字符压缩
字符的大小写转换
$ echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'
hello who is this
对字符进行加密
tr命令可以用来加密。ROT13是一个著名的加密算法。在ROT13算法中,字符会被移动13
个位置,因此文本加密和解密都使用同一个函数
$ echo "tr came, tr saw, tr conquered." | tr 'a-zA-Z' 'n-za-mN-ZA-M'
ge pnzr, ge fnj, ge pbadhrerq.
删除字符
$ echo "Hello 123 world 456" | tr -d '0-9'
Hello world
字符组补集
tr -c [set1] [set2]
如果只给出了set1,那么tr会删除所有不在set1中的字符。如果也给出了set2,tr会将不 在set1中的字符转换成set2中的字符。如果使用了-c选项,set1和set2必须都给出。如果-c 与-d选项同时出现,你只能使用set1,其他所有的字符都会被删除
$ echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'
1 2 4
-d -c 同时使用时 只保留给定set字符中的字符
$ echo hello 1 char 2 next 4 | tr -c '0-9' ' '
1 2 4
只使用-c 时 将非字符集替换
用tr压缩字符
$ echo "GNU is not UNIX. Recursive right ?" |tr -s ' '
GNU is not UNIX. Recursive right ?
删除字符中重复的空格
tr的灵活运用
sum.txt
$ cat sum.txt
1
2
3
4
5
计算sum文件中所有数的和
$ cat sum.txt |echo $[ `tr '\n' '+'` 0]
15
tr ‘\n’ ‘+’ 将换行替换成+ 得到表达式 1+2+3+4+5+
再将其与0 拼接 得到表达式 1+2+3+4+5+0
最后运行该表达式得到总数
另外一个例子
test.txt
$ cat test.txt
first 1
second 2
third 3
计算test中数字的总和
$ cat test.txt |tr -d [a-z]|echo "total $[ `tr ' ' '+'`]"
total 6
利用tr的-d选项删除文件中的字母,然后将空格替换成+
可以使用的字符类
- alnum:字母和数字。
- alpha:字母。
- cntrl:控制(非打印)字符。 digit:数字。
- graph:图形字符。
- lower:小写字母。
- print:可打印字符。
- punct:标点符号。
- space:空白字符。
- upper:大写字母。
- xdigit:十六进制字符。
$ echo 'coco is handsome 123 !' |tr -d [:alnum:]
!
md5sum
计算文件的md5sum
coco.log
$ cat coco.log
coco is handsome
$ md5sum coco.log
7fdc4a7ed1e76c6e1e1ac2ae24fd2068 coco.log
保存校验信息
$ md5sum coco.log > coco.md5
$ md5sum -c coco.md5
coco.log: OK # 校验 ok
$ vi coco.log
$ cat coco.log
coco is handsome !
$ md5sum -c coco.md5
coco.log: FAILED # 原文件中添加! 校验 fail
md5sum: WARNING: 1 computed checksum did NOT match
递归校验
md5deep或sha1deep命令可以遍历目录树,计算其中所有文件的校验和。你的系统中可能 并没有安装这两个程序。可以使用apt-get或yum来安装md5deep软件包
$ md5deep -rl directory_path > directory.md5
# -r使用递归遍历
# -l使用相对路径。默认情况下,md5deep会输出文件的绝对路径
也可以结合find 命令进行递归校验
$ find directory_path -type f –print0 | xargs -0 md5sum >> directory.md5
md5与SHA-1都是单向散列算法,均无法逆推出原始数据。两者通常用于为特定数据生成 唯一的密钥