在博文 《如何学习 Linux 命令和工具》 中,简要地谈了下学习 linux 命令的一些基本方法和注意事项。 本文将以 tr 为例, 来谈谈如何具体地学习某个 linux 命令。注意,重点不在命令本身,而在于命令的学习方法上。收获几条鱼不如学会一套行之有效的捕鱼之法。
示例一: tr
(1) 先查看帮助信息, tr --help 或 man tr :
可知该命令主要是用来作字符过滤处理的。由于选项放在方括号中,是可选的。先不使用任何选项:用法:tr [选项]... SET1 [SET2] 从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。 -c, -C, --complement 首先补足SET1 -d, --delete 删除匹配SET1 的内容,并不作替换 -s, --squeeze-repeats 如果匹配于SET1 的字符在输入序列中存在连续的 重复,在替换时会被统一缩为一个字符的长度 -t, --truncate-set1 先将SET1 的长度截为和SET2 相等 --help 显示此帮助信息并退出 --version 显示版本信息并退出
从结果中可以看到, tr 是用作字符转换的(以字符为转换单位,而不是字符序列), 将前面指定的字符集中定义的字符的所有出现替换成后面指定的字符集中位置相对应的字符的出现。看上去可以用作小小的加密方式哦。 试一试位置长度不匹配的情形:$:~/csat/packages$ tr 'eaiou' 'fbjpv' i have a dream j hbvf b drfbm
a. SET1 长度小于 SET2 : 看上去好像没影响
$:~/csat/packages$ tr 'eaiou' 'fbjpvt' i have a dream , and you ? j hbvf b drfbm , bnd ypv ?
b. SET1 长度大于 SET2: SET1 按位置对应多出的字符的出现都被替换成 SET2 的最后一个字符的出现
$:~/csat/packages$ tr 'eaiou' 'fbjp' i love you, u know ? j lpvf ypp, p knpw ?
o,u 都替换成 p 了。 -t 选项看上有点关联,试试:
现在 o, u 都不再被替换了。 可以理解 -t 的作用了。 它实际上是执行命令 tr 'eai' 'fbj' , 将 'eaiou' 截成与 'fbj' 等长,保留前面的部分。$:~/csat/packages$ tr -t 'eaiou' 'fbj' i love you j lovf you
由于选项比较少,可以一个个地尝试下:
$:~/csat/packages$ tr -d 'ea' i have a good dream. i hv good drm. ^C
该选项是从给定输入中删除给定字符集中定义的所有字符('e','a')的所有单个的出现, 而不是删除字符组合 ea. 这是删除功能;
(2) 遵循Linux 命令惯例, 任何可以从标准输入中读取输入内容的命令都同样作用于从管道输出的内容或重定向的输入。可以将标准输入作为一个交互式工具,用作工具的单元测试,以及验证自己是否理解正确。在确保这一步后, 就可以使用更实用的方式, 试试:
$ man tr | tr -d 'ea'
$ tr 'a-z' 'A-Z' < data.txt > result.txt 或者 cat data.txt | tr 'a-z' 'A-Z' > result.txt
(3) 测试 -s, -c, 选项。
$:~/csat/packages$ tr -s 'ea' eeecccaaaeee ecccae
-s 的作用是: 若指定字符集中定义的字符在输入中连续重复出现, 则将其所有重复出现的替换成一个不重复的出现。不在指定字符集中定义的字符连续出现不受影响。这是缩减功能。
注意到, -c 的翻译有点不解其意。 看看 man 文档是怎么说的: -c, -C, --complement use the complement of SET1 . 取 SET1 的补集? 含义有点模糊,可以上网搜索一下: 搜到 《shell tr命令的使用》 , 是这么说的: 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换,常与-d , -s配合使用。有点明白,试试:
$:~/csat/packages$ cat a.txt | tr -c 'eaiou' 'H' aHHHeHHHiHHHHHoHHHHHuHHHHHH 其中, a.txt 的内容是 abcdefghijklmnopqrstuvwxyz
所有非 eaiou 的字符都被替换成 H了.
至此, tr 命令选项的基本含义和用法都清楚了, 接下来需要了解其使用场合。 网上有很多相关文章, 可以参阅。当然,也可以自己先尝试下解决网上提出的问题。
总结一下:
1. 首先查看帮助文档, 那是最权威的指导信息;
2. 首先使用无选项试用该命令。Linux 命令以选项繁多而遭人指责。实际上,使用无选项的默认情况也许就能解决很多问题了。选项只是锦上添花。
3. 阅读选项含义,动手实践选项的用法。这考验一个人的理解能力和计算机功底。记得一个大牛说过: To program is to understand.
选项分独立选项和非独立选项。 大多数选项是独立的,可以单独使用和测试; 有些选项是非独立的,要与其他选项联合使用;
选项有不同功用,有的用来控制处理过程,有的用来控制行为效果,有的用来控制输出,有的用来控制输入格式。适当分类有利于更好地掌握繁多的选项;
大多数选项之间是独立的,可以联合使用; 先尝试独立单一选项,再尝试联合使用;
4. 善于搜索,在网上寻求解答。 但是不要过于依赖,否则,无法提高自己独立解决问题的能力;
5. 中文文档有时翻译的不太好,最好参考英文文档信息;不要回避学习英文,它可能决定一个人IT生涯的基本高度;
6. 大多数命令都是默认接受标准输入,同时能够接受管道输入和文件重定向输入,并能默认输出到标准输出,也能够输出到管道和文件。默认方式可用于交互式测试工具,而管道和重定向则是真正实用的使用方式。
tr 命令代表了一大类的命令, 它们选项较少, 但短小精悍,非常实用, 并且只需要浅显的计算机专业知识就能理解。 类似的命令还有 uniq, wc , tail , head 等。