天天看點

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服務

繼續閱讀