天天看点

tr命令解析_学习笔记

时间:2017.11.15

作者:李强

参考:man,info,magedu讲义

声明:以下英文纯属个人翻译,英文B级,欢迎纠正,盗版不纠,才能有限,希望不误人子弟为好。

1、使用目的与场景

  把STDIN的字符进行转换,压缩,删除的操作,然后输出到STDOUT上,具体案例在什么实际工作哪里能用到因为还没有参加工作,所以先不揣测,但是应该可以对文本进行操作。应该类似于windows下的查找替换的功能。

2、官方说明

  Translate, squeeze, and/or delete characters

3、写在前面

  tr的使用主要还是在格式上的理解,如何去更简洁的表达你想要修改的字符集,选择合适的选项,达到你想要字符集修改的效果。选项一般为单词的简写取首,加上长字节利于自己记忆,然后就是要理解这个单词的具体用法,这就要自己摸索着时间,将别人讲的转化为自己的理解,看八百遍讲义不敲不琢磨,除非你天才。

4、修改文件及涉及的环境变量

5、用法

<code> </code><code>tr</code> <code>[OPTION]... SET1 [SET2]</code>

<code>  </code><code>#选项的理解</code>

<code>  </code><code>#当没有选项时,默认执行-t转换操作,-t 可以省略不写,这时不能只有set1没有set2,要成对。</code>

<code>     </code><code>-c -C  --complement求补,求SET1的补集(所有不是SET1字符的字符)</code>

<code>     </code><code>-d     --delete 删除,删除SET1的字符不进行转化,那么SET2就不用添加了,</code>

<code>     </code><code>-s    --squeeze-repeats 挤压重复字符,</code>

<code>     </code><code>-t    --truncate-set1 将第一个字符集对应字符转化为第二字符集 对应的字符</code>

参数的格式问题:

这里感觉好多参数的格式都是基于shell可以识别的一种通配符的格式,并非正则表达式(需要正则表达式 去解释),比如说[0-9][a-z],但是这种有兼容性问题,还是用这些字符类表达比较好[:alpha:][:digit:] 

\r \n \NNN 这种风格的,还有^,

<code> </code><code>正常字符表示正常字符</code>

<code>      </code><code>CHAR1-CHAR2  all characters from CHAR1 to CHAR2 </code><code>in</code> <code>ascending order       </code>

<code>       </code><code>[CHAR*]   用在SET2,复制CHAR字符直到长度和SET1相同</code>

<code>       </code><code>[CHAR*N]  代表有N个重复的CHAR字符,N如果是0开头就是8进制,不是就是10进制。</code>

<code>     </code><code>#参数可以是转义字符</code>

<code>       </code><code>\NNN   字符用八进制表示可以去查看下ASCII编码然后对应转化为八进制</code>

<code>       </code><code>\\     表示转义字符本身</code>

<code>       </code><code>\a     audible BEL</code>

<code>       </code><code>\b     backspace</code>

<code>       </code><code>\f     form feed</code>

<code>       </code><code>\n     回车</code>

<code>       </code><code>\r     换行</code>

<code>       </code><code>\t     水平tab</code>

<code>       </code><code>\</code><code>v</code>     <code>垂直tab</code>

<code>       </code><code>#字符类有哪些?以下下是预定义类。</code>

<code>      </code><code>[:digit:] 所有数字</code>

<code>      </code><code>[:lower:] 所有小写</code>

<code>      </code><code>[:upper:] 所有大写</code>

<code>      </code><code>[:alpha:] 所有字母</code>

<code>      </code><code>[:alnum:] 所有字母和数字</code>

<code>      </code><code>[:punct:] 标点符号</code>

<code>      </code><code>[:space:] 所有水平和垂直空白</code>

<code>      </code><code>[:graph:] 打印字符,不包括空格</code>

<code>      </code><code>[:print:] 可打印字符,包括空格</code>

<code>      </code><code>[:cntrl:] 控制字符,表示哪些不晓得?</code>

<code>      </code><code>[:Xdigit:] 所有16进制数字</code>

  [=C=]是个最近的发明,旨在扩展到所有非字母字符,但并不是所有GNU tr都支持,这个回头试试,看能不能匹配匹配中文。

  tr set1 set2,当set1和set2的字符长度不同时什么情况

  当set1小于set2 比如abc和1234,那么只会讲stdin中的abc替换为123,4就被忽略了

  当set1大于set2 比如abcd和123,那么我输入abcdefg,就会被转换成1233efg了,它会拿set2的最后一个字符去替换set1中没有匹配到的,比如abcde和123,那么输入abcdefg就会被转成12333fg。

     比如这里 abc 和空格, 这里会转成3个空格。  

  所以一般情况下要注意set1和set2要保持相同

  学命令就像学文言文,给你说了文言文格式,但是要翻译的好,还是要看你的语文功底了。

实际的案例:(根据实际当中的操作不定期补充)

1、ss -nt |tail -n +2 |tr -s " " ":"| cut -d ":" -f 4

<code>[root@centos6 </code><code>/app</code><code>]</code><code>#ss -nt</code>

<code>State      Recv-Q Send-Q Local Address:Port  Peer Address:Port </code>

<code>ESTAB      0      0   172.18.23.6:22    172.18.1.50:1696  </code>

<code>ESTAB      0      0   172.18.23.6:22    172.18.1.50:12053 </code>

<code>ESTAB      0      0   172.18.23.6:22    172.18.1.50:12226 </code>

<code>[root@centos6 </code><code>/app</code><code>]</code><code>#ss -nt |tail -n +2 |tr -s " " ":"| \</code>

<code>&gt; </code><code>cut</code> <code>-d </code><code>":"</code> <code>-f 4 | </code><code>uniq</code> <code>-c</code>

<code>   </code><code>3 172.18.23.6</code>

<code>[root@centos6 </code><code>/app</code><code>]</code><code>#</code>

这里是把空格压缩然后抓换为冒号。

这里的-s相当于-st,当有set1和set2存在时,t是默认值可以不写。

2、echo 12345|tr '0-9' '987654321'

本文转自 lajifeiwomoshu 51CTO博客,原文链接:http://blog.51cto.com/lajifeiwomoshu/1982127

上一篇: kafka
下一篇: FTP服务

继续阅读