bash基礎特性、正規表示式

nh39304發表於2019-07-15

一、bash特性
1. 命令歷史: history
   .bash_history:使用者登出時儲存命令歷史的檔案(使用者家目錄下的隱藏檔案)
   history #:顯示最近的#條命令;  
   呼叫命令歷史列表中的命令
        !#:再一次執行歷史列表中的第#條命令;
        !!:再一次執行上一條命令;
        !STRING:再一次執行命令歷史列表中最近一個以STRING開頭的命令;
   呼叫上一條命令的最後一個引數:
快捷鍵:ESC, .     (ESC鬆開後再按.)
快捷鍵:Alt+.      (按住Alt再按.)
字串:!$         (直接輸入!$)
[root@localhost local]# cat /tmp/script/idsum1.sh 
......
[root@localhost local]# vi !$
vi /tmp/script/idsum1.sh

2.補全:
       命令補全: 能唯一標識,則直接Tab補全,不能的話,再按一次Tab給出列表;
           外部命令根據PATH環境變數中設定的目錄,自左而右逐個搜尋目錄下的檔名
       路徑補全: 唯一標識Tab補全,不能的話,再按一次Tab給出列表;
3.命令列展開
 ~:自動展開為使用者的家目錄,或指定的使用者的家目錄;
 {}:可承載一個以逗號分隔的路徑列表,並能夠將其展開為多個路徑;


[root@localhost tmp]# ls x_{y,z}
x_y:
afile1  afile2
x_z:
afile3  afile4

4.命令的狀態執行結果
    成功: 返回0;
    失敗: 1~255;
    命令執行完成後,執行狀態儲存在bash的特殊變數$?中;
[root@localhost x_z]# useradd yc
[root@localhost x_z]# echo $?
[root@localhost x_z]# useradd yc
useradd: user 'yc' already exists
[root@localhost x_z]# echo $?
9

    命令正常執行時,有的還會有命令返回值,根據命令及其功能不同,結果各不相同。
    引用命令的執行結果:$(COMMAND)或~(COMMAND)
5.引用
    強引用:單引號,其中任何內容直接顯示,不做替換。
    弱引用:雙引號,其中變數做變數替換,將出現變數的地方替換成變數的值。
    命令引用:反單引號,就是引用命令執行結果,$(COMMAND)或~(COMMAND)。
[root@localhost x_z]# name="YC"
[root@localhost x_z]# echo '$name'
$name    
[root@localhost x_z]# echo "$name"
YC
[root@localhost x_z]# mkdir dir_`date +%h-%M-%S`
[root@localhost x_z]# ls
afiel3  afile4  dir_Jul-48-03

6.快捷鍵
  ctrl+a : 跳至命令列首;
  ctrl+c : 跳至命令列尾;
  ctrl+u : 刪除從行首到游標;
  ctrl+k : 刪除從游標到行尾;
  ctrl+l : clear;
7. 檔案萬用字元 globbing
      萬用字元實際上是一種shell實現的路徑擴充套件功能,當shell在“引數”中遇到萬用字元後,
  會將其當做路徑或檔名在磁碟上搜尋可能的匹配。
      * : 匹配任意長度任意字元;
      ? : 匹配任意單個字元,如??pa,p?a?;
      []: 匹配指定範圍內的任意單個字元;
          有幾種特殊格式: [a-z];[A-Z];[0-9];[a-z0-9]
          [[:upper:]]  :  所有大寫字母  
          [[:lower:]]  :  所有小寫字母
          [[:digit:]]  :  所有數字
          [[:alpha:]]  :  所有字母
          [[:alnum:]]  :  所有字母和數字
          [[:space:]]  :  空格字元
          [[:punct:]]  :  所有標點符號
   不記得沒關係,man grep裡面有:Their names are self explanatory, and
       they  are  [:alnum:],   [:alpha:],   [:cntrl:],   [:digit:],   [:graph:],
       [:lower:],  [:print:],  [:punct:],  [:space:], [:upper:], and [:xdigit:].
       For example, [[:alnum:]] means the character class of numbers and letters
       in  the current locale. In the C locale and ASCII character set encoding,
       this is the same as [0-9A-Za-z]
  ^[]: 匹配指定範圍外的任意單個字元;
       [^[:upper:]]
       [^a-z]
   示例:
[root@localhost x_z]# ls *[Ff]ile*      ---含File或者file的檔名
afile4  myfile  MyFile  myfile_002
[root@localhost x_z]# find /tmp/x_z/ -name  "*[^[:alpha:]]*"  ---含非字母的檔名
/tmp/x_z/
/tmp/x_z/afile4
/tmp/x_z/afiel3
/tmp/x_z/dir_Jul-48-03
/tmp/x_z/1.txt
/tmp/x_z/myfile_002
[root@localhost x_z]# find /tmp/x_z/ -name  "*[^a-z]*"   ---含非小寫字母的檔名
/tmp/x_z/
/tmp/x_z/afile4
/tmp/x_z/afiel3
/tmp/x_z/dir_Jul-48-03
/tmp/x_z/1.txt
/tmp/x_z/myfile_002
/tmp/x_z/MyFile


二、正規表示式
   由一類特殊字符集文字字元所編寫的模式,其中有些字元不表示其字面意義(要表示要用轉義字元/),而是用於表示控制或者統配的功能。
       表示式組成:原義文字字元+元字元
   元字元:指那些在正規表示式中具有特殊意義的專用字元,它使正規表示式具有處理能力。
   grep:Global search Regular expression and print out the line
        文字搜尋工具,根據使用者指定的模式(過濾條件)對目標檔案逐行進行匹配檢查,列印匹配的行;
        正規表示式引擎:元字元及規則因引擎的不同略有不同。
        grep [OPTIONS] PATTERN [FILE...]
        grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
        OPIONTS:
          -i : 不區分大小寫(ignore case);
          -o : 僅顯示匹配到的字元;
          -v : 顯示不能匹配到的行;
          -q : 不輸出任何資訊(當只需要執行結果狀態時使用)
          -E : 支援擴充套件正規表示式
          -A #: after 匹配行的後#行
          -B #: before匹配行的前#行
          -C #: context 匹配行的前後#行
    基本正規表示式元字元:
        字元匹配
      . : 匹配任意單個字元;
      []: 匹配指定範圍內的任意單個字元;
          有幾種特殊格式: [a-z];[A-Z];[0-9];[a-z0-9]
          [[:upper:]]  :  所有大寫字母  
          [[:lower:]]  :  所有小寫字母
          [[:digit:]]  :  所有數字
          [[:alpha:]]  :  所有字母
          [[:alnum:]]  :  所有字母和數字
          [[:space:]]  :  空格字元
          [[:punct:]]  :  所有標點符號
  man grep裡面:Their names are self explanatory, and
       they  are  [:alnum:],   [:alpha:],   [:cntrl:],   [:digit:],   [:graph:],
       [:lower:],  [:print:],  [:punct:],  [:space:], [:upper:], and [:xdigit:].
       For example, [[:alnum:]] means the character class of numbers and letters
       in  the current locale. In the C locale and ASCII character set encoding,
       this is the same as [0-9A-Za-z]
  ^[]: 匹配指定範圍外的任意單個字元;
       [^[:upper:]]
次數匹配: 指定出現的次數的字元後面,限制前面字元出現的次數,實行貪婪模式
           貪婪模式:在整個表示式匹配成功的前提下,儘可能多的匹配;
       *   : 匹配前面字元的任意次,0次,1次或者多次
       .*  : 匹配前面任意長度的任意字元;
       \?  : 匹配前面字元0次或者1次,即可有可無;
       \+  : 匹配前面字元1次或者多次,即必存在;
       \{m\} : 匹配前面字元指定m次;
       \{m,n\} : 匹配前面字元至少m次,至多n次;
            \{0,n\}  : 匹配前面字元至多n次;
            \{m,\}  : 匹配前面字元至少m次;
               位置錨定: 
   ^  : 行首錨定
   $  : 行尾錨定;
      ^PATTEERN$  : 用PATTERN來匹配整行;
      ^$  : 空白行;
      ^[[:space:]]*$ : 空行或者包含空白字元的行;
單詞錨定:
                     \<或者\b : 詞首錨定,放在詞的前面;
     \>或者\b : 詞尾錨定,放在詞的後面;
      \<PATTEERN\>  : 匹配完整單詞PATTERN;
分組及引用
   \(\)   :將一個或者多個字元捆綁在一起,作為一個整體處理;用括號括起來,表示括號時要用轉義字元;
               注意:分組括號中的模式匹配到的內容會被正規表示式引擎自動記錄於內部變數中,這些變數為:
                  \1:  模式從左邊起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字元;
                  \2:  模式從左邊起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字元;
                  \3:  
            後項引用: 引用前面的分組括號中的模式所匹配的字元;

    練習:

    2. 顯示/etc/passwd檔案中不以/bin/bash結尾的行

[root@localhost x_z]# grep   -v “/bin/bash$” /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......

    3. 找出/etc/passwd中包含二位數字或者三位數字的行

[root@localhost x_z]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
......

    4. 顯示/porc/meminfo檔案中大寫或者小寫S開頭的行      

[root@localhost x_z]# grep "^[Ss]\+*" /proc/meminfo   ----錯誤示範,這個*可以是0次,沒有s也行;
MemTotal:        3868768 kB
MemFree:         2927360 kB
....
[root@localhost x_z]# grep "^[Ss]\+" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              9368 kB
Slab:             149628 kB
SReclaimable:      85044 kB
SUnreclaim:        64584 kB
[root@localhost x_z]# grep -i "^[s]\+" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              9368 kB
Slab:             149628 kB
SReclaimable:      85044 kB
SUnreclaim:        64584 kB
[root@localhost x_z]# grep -E "^(s|S)+" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Shmem:              9368 kB
Slab:             149788 kB
SReclaimable:      85028 kB
SUnreclaim:        64760 kB

    egrep 支援擴充套件的正規表示式,實現grep文字過濾功能;grep -E
      -i;-o;-v;-q;-G(基本正規表示式)
      支援擴充套件正規表示式元字元:
        字元匹配
      . : 匹配任意單個字元;
      []: 匹配指定範圍內的任意單個字元;
       ^[]: 匹配指定範圍外的任意單個字元;
次數匹配: 指定出現的次數的字元後面,限制前面字元出現的次數,實行貪婪模式
   貪婪模式:在整個表示式匹配成功的前提下,儘可能多的匹配;
   *   : 匹配前面字元的任意次,0次,1次或者多次
   .*  : 匹配前面任意長度的任意字元;
   ?  : 匹配前面字元0次或者1次,即可有可無;
   +  : 匹配前面字元1次或者多次,即必存在;
   {m} : 匹配前面字元指定m次;
   {m,n} : 匹配前面字元至少m次,至多n次;
      {0,n}  : 匹配前面字元至多n次;
      {m,}  : 匹配前面字元至少m次;
               位置錨定: 
   ^  : 行首錨定
   $  : 行尾錨定;
        ^PATTEERN$  : 用PATTERN來匹配整行;
        ^$  : 空白行;
        ^[[:space:]]*$ : 空行或者包含空白字元的行;
單詞錨定:
   \<或者\b : 詞首錨定,放在詞的前面;
   \>或者\b : 詞尾錨定,放在詞的後面;
      \<PATTEERN\>  : 匹配完整單詞PATTERN;
分組及引用
   ( ):將一個或者多個字元捆綁在一起,作為一個整體處理;用括號括起來,表示括號時要用轉義字元;
        注意:分組括號中的模式匹配到的內容會被正規表示式引擎自動記錄於內部變數中,這些變數為:
                  \1: 模式從左邊起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字元;
                  \2: 模式從左邊起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字元;
                  \3:  
後項引用: 引用前面的分組括號中的模式所匹配的字元; 
或 a|b
     如  C|cat 表示C或者cat;
     (C|c)at 表示Cat或者cat;

    練習:

        5. 使用echo輸出一個絕對路徑,使用egrep取出路徑名,類似執行dirname /etc/passwd的結果。

[root@localhost pp]# pwd
/tmp/x_z/pp
[root@localhost pp]# ls
YC.sh
[root@localhost pp]# dirname /tmp/x_z/pp/YC.sh 
/tmp/x_z/pp
[root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E  ".*/\<"    ----顯示匹配的行全部
/tmp/x_z/pp/YC.sh
[root@localhost pp]# echo /tmp/x_z/pp/YC.sh | grep -E -o ".*/\<" 
/tmp/x_z/pp/

        6. 找出ifconfig的IP地址,要求結果中只顯示IP地址。

[root@localhost pp]# ifconfig  | grep -Eo "(\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.){3}
\<([0-9]|[0-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
192.167.1.23
255.255.255.0
192.167.1.255
127.0.0.1
255.0.0.0

fgrep: 不支援正規表示式元字元,任何符號都是字元;
     當無需要用到元字元去編寫模式時,使用fgrep會更好。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69934036/viewspace-2650494/,如需轉載,請註明出處,否則將追究法律責任。

相關文章