天天看點

shell腳本之sort、uniq、tr指令和正規表達式

文章目錄

      • sort指令
        • 常用選項:
      • uniq指令
        • 常用選項:
      • tr指令
        • 常用選項:
        • 參數:
      • 正規表達式
        • 基礎正規表達式
        • 擴充正規表達式

sort指令

以行為機關對檔案内容進行排序,也可以根據不同的資料類型來排序

文法格式:

sort [選項] 參數
cat file | sort 選項
           

常用選項:

-f:忽略大小寫,預設會将大寫字母排在前面

-b:忽略每行前面的空格

-n:按照數字進行排序

-r:反向排序

-u:等同于uniq,表示相同的資料僅顯示一行

-t:指定字段分隔符,預設使用[Tab]鍵分隔

-k:指定排序字段

-o <輸出檔案>:将排序後的結果轉存至指定檔案

shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式

uniq指令

用于報告或者忽略檔案中連續的重複行,常與 sort 指令結合使用

文法格式:

uniq [選項] 參數
cat file | uniq 選項
           

常用選項:

-c:進行計數,并删除檔案中連續重複出現的行

-d:僅顯示連續的重複行

-u:僅顯示不連續的隻出現一次的行

shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式
shell腳本之sort、uniq、tr指令和正規表達式

tr指令

常用來對來自标準輸入的字元進行替換、壓縮和删除

文法格式:

tr [選項] [參數]
           

常用選項:

-c:保留字元集1的字元,其他的字元(包括換行符\n)用字元集2替換

-d:删除所有屬于字元集1的字元

-s:将重複出現的字元串壓縮為一個字元串;用字元集2替換字元集1

-t:字元集2替換字元集1,不加選項同結果

參數:

  • 字元集1:指定要轉換或删除的原字元集。當執行轉換操作時,必須使用參數“字元集2"指定轉換的目标字元集。但執行删除操作時,不需要參數"字元集2"。
  • 字元集2:指定要轉換成的目标字元集。
    echo "xyz" | tr 'a-z' 'A-Z'
    echo "xyz" | tr -t 'a-z' 'A-Z'
               
shell腳本之sort、uniq、tr指令和正規表達式
echo -e "xyz\nxyzhxyz" | tr -c "xy\n" "1"
           
shell腳本之sort、uniq、tr指令和正規表達式
echo "gooooodhjjl" | tr -d "oj"
echo "gooooodhjjl" | tr -d 'oj'
           
shell腳本之sort、uniq、tr指令和正規表達式
echo "gooodeel haan" | tr -s 'oea'
echo "gooodeel haan" | tr -s 'oea' "123"
           
shell腳本之sort、uniq、tr指令和正規表達式

可以使用tr和sort指令進行數組的排序

shell腳本之sort、uniq、tr指令和正規表達式

正規表達式

  • 正規表達式通常用于判斷語句中,用來檢查某一字元串是否滿足某一格式
  • 正規表達式是由普通字元與元字元組成
  • 普通字元包括大小寫字母、數字、标點符号及一些其他符号
  • 元字元是指在正規表達式中具有特殊意義的專用字元,可以用來規定其前導字元(即位于元字元前面的字元)在目标對象中的出現模式

基礎正規表達式

支援的工具:grep、egrep、sed、awk

基礎正規表達式常見元字元:

\ :轉義字元,用于取消特殊符号的含義,例:\!、\n、\$等

^ :比對字元串開始的位置,例:^a、^the、^#、^[a-z]

$ :比對字元串結束的位置,例:word$、^$比對空行

. :比對除\n之外的任意的一個字元,例:go.d、g..d

* :比對前面子表達式0次或者多次,例:goo*d、go.*d

[list] :比對list清單中的一個字元,例:go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]比對任意一位數字

[^list] :比對任意非list清單中的一個字元,例:[^0-9]、[^A-Z0-9]、[^a-z]比對任意一位非小寫字母

\{n\} :比對前面的子表達式n次,例:go\{2\}d、'[0-9]\{2\}'比對兩位數字

\{n,\} :比對前面的子表達式不少于n次,例:go\{2,\}d、'[0-9]\{2,\}'比對兩位及兩位以上數字

\{n,m\} :比對前面的子表達式n到m次,例:go\{2,3\}d、'[0-9]\{2,3\}'比對兩位到三位數字

注:egrep、awk使用{n}、{n,}、{n,m}比對時“{}”前不用加“\”
           
shell腳本之sort、uniq、tr指令和正規表達式

擴充正規表達式

支援的工具:egrep、awk

擴充正規表達式元字元:

+ :比對前面子表達式1次以上,例:go+d,将比對至少一個o,如god、good、goood等

? :比對前面子表達式0次或者1次,例:go?d,将比對gd或god

() :将括号中的字元串作為一個整體,例1:g(oo)+d,将比對oo整體1次以上,如good、gooood等

| :以或的方式比對字條串,例:g(oo|la)d,将比對good或者glad
           

舉例:

比對173開頭的手機号

#以173開頭,後面随機8位數字組合
"^173[0-9]{8}$"

egrep "^173[0-9]{8}$" shou.txt
grep "^173[0-9]\{8\}$" shou.txt 
           
shell腳本之sort、uniq、tr指令和正規表達式

比對E-mail位址

使用者名@ :^([a-zA-Z0-9_\-\.\+]+)@
子域名 :([a-zA-Z0-9_\-\.]+)
頂級域名(字元串長度一般在2到5) :\.([a-zA-Z]\{2,5\})$

egrep '^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$' you.sh
awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' you.sh
           
shell腳本之sort、uniq、tr指令和正規表達式

繼續閱讀