Linux命令學習示例:tr
在博文 《如何學習 Linux 命令和工具》 中,簡要地談了下學習 linux 命令的一些基本方法和注意事項。 本文將以一些命令為例, 來談談如何具體地學習某個 linux 命令。注意,本文的重點不在命令本身,而在於命令的學習方法上。給人一蘿筐魚不如教人一套行之有效的捕魚之法。
www.2cto.com
示例一: tr
(1) 先查看幫助信息, tr --help 或 man tr :
[plain]
用法:tr [選項]... SET1 [SET2]
從標准輸入中替換、縮減和/或刪除字符,並將結果寫到標准輸出。
-c, -C, --complement 首先補足SET1
-d, --delete 刪除匹配SET1 的內容,並不作替換
-s, --squeeze-repeats 如果匹配於SET1 的字符在輸入序列中存在連續的
重復,在替換時會被統一縮為一個字符的長度
-t, --truncate-set1 先將SET1 的長度截為和SET2 相等
--help 顯示此幫助信息並退出
--version 顯示版本信息並退出
可知該命令主要是用來作字符過濾處理的。由於選項放在方括號中,是可選的。先不使用任何選項: www.2cto.com
[plain]
$:~/csat/packages$ tr 'eaiou' 'fbjpv'
i have a dream
j hbvf b drfbm
從結果中可以看到, tr 是用作字符轉換的(以字符為轉換單位,而不是字符序列), 將前面指定的字符集中定義的字符的所有出現替換成後面指定的字符集中位置相對應的字符的出現。看上去可以用作小小的加密方式哦。 試一試位置長度不匹配的情形:
a. SET1 長度小於 SET2 : 看上去好像沒影響
[plain]
$:~/csat/packages$ tr 'eaiou' 'fbjpvt'
i have a dream , and you ?
j hbvf b drfbm , bnd ypv ?
b. SET1 長度大於 SET2: SET1 按位置對應多出的字符的出現都被替換成 SET2 的最後一個字符的出現
[plain]
$:~/csat/packages$ tr 'eaiou' 'fbjp'
i love you, u know ?
j lpvf ypp, p knpw ?
o,u 都替換成 p 了。 -t 選項看上有點關聯,試試:
[plain]
$:~/csat/packages$ tr -t 'eaiou' 'fbj'
i love you
j lovf you
現在 o, u 都不再被替換了。 可以理解 -t 的作用了。 它實際上是執行命令 tr 'eai' 'fbj' , 將 'eaiou' 截成與 'fbj' 等長,保留前面的部分。
由於選項比較少,可以一個個地嘗試下:
[plain]
$:~/csat/packages$ tr -d 'ea'
i have a good dream.
i hv good drm.
^C
該選項是從給定輸入中刪除給定字符集中定義的所有字符('e','a')的所有單個的出現, 而不是刪除字符組合 ea. 這是刪除功能;
www.2cto.com
(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, 選項。
[plain]
$:~/csat/packages$ tr -s 'ea'
eeecccaaaeee
ecccae
-s 的作用是: 若指定字符集中定義的字符在輸入中連續重復出現, 則將其所有重復出現的替換成一個不重復的出現。不在指定字符集中定義的字符連續出現不受影響。這是縮減功能。
注意到, -c 的翻譯有點不解其意。 看看 man 文檔是怎麼說的: -c, -C, --complement use the complement of SET1 . 取 SET1 的補集? 含義有點模糊,可以上網搜索一下: 搜到 《shell tr命令的使用》 , 是這麼說的: 反選設定字符。也就是符合 SET1 的部份不做處理,不符合的剩余部份才進行轉換,常與-d , -s配合使用。有點明白,試試:
[plain]
$:~/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.
www.2cto.com
選項分獨立選項和非獨立選項。 大多數選項是獨立的,可以單獨使用和測試; 有些選項是非獨立的,要與其他選項聯合使用;
選項有不同功用,有的用來控制處理過程,有的用來控制行為效果,有的用來控制輸出,有的用來控制輸入格式。適當分類有利於更好地掌握繁多的選項;
大多數選項之間是獨立的,可以聯合使用; 先嘗試獨立單一選項,再嘗試聯合使用;
4. 善於搜索,在網上尋求解答。 但是不要過於依賴,否則,無法提高自己獨立解決問題的能力;
5. 中文文檔有時翻譯的不太好,最好參考英文文檔信息;不要回避學習英文,它可能決定一個人IT生涯的基本高度;
6. 大多數命令都是默認接受標准輸入,同時能夠接受管道輸入和文件重定向輸入,並能默認輸出到標准輸出,也能夠輸出到管道和文件。默認方式可用於交互式測試工具,而管道和重定向則是真正實用的使用方式。
tr 命令代表了一大類的命令, 它們選項較少, 但短小精悍,非常實用, 並且只需要淺顯的計算機專業知識就能理解。 類似的命令還有 uniq, wc , tail , head 等。