在博文
《如何學習 Linux 命令和工具》 中,簡要地談了下學習 linux 命令的一些基本方法和注意事項。 本文將以一些命令為例, 來談談如何具體地學習某個 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顯示版本資訊並退出
可知該命令主要是用來作字元過濾處理的。由於選項放在方括弧中,是可選的。先不使用任何選項:
$:~/csat/packages$ tr 'eaiou' 'fbjpv'i have a dreamj hbvf b drfbm
從結果中可以看到, tr 是用作字元轉換的(以字元為轉換單位,而不是字元序列), 將前面指定的字元集中定義的字元的所有出現替換成後面指定的字元集中位置相對應的字元的出現。看上去可以用作小小的加密方式哦。 試一試位置長度不匹配的情形:
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 選項看上有點關聯,試試:
$:~/csat/packages$ tr -t 'eaiou' 'fbj'i love youj lovf you
現在 o, u 都不再被替換了。 可以理解 -t 的作用了。 它實際上是執行命令 tr 'eai' 'fbj' , 將 'eaiou' 截成與 'fbj' 等長,保留前面的部分。
由於選項比較少,可以一個個地嘗試下:
$:~/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'eeecccaaaeeeecccae
-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 等。