文字三劍客之grep的用法

上善若水~小輝發表於2020-09-06

第1章         正規表示式

1.1    正規表示式的介紹

              正則是用來過濾檔案內容

              為處理大量文字|字串而定義的一套規則和方法

              以行為單位出來,一次處理一行。

1.2   為什麼使用正規表示式

        1)linux運維工作 大量過濾(找東西)日誌工作。化繁為簡。

        2)簡單,高效,易用。

        3)正規表示式高階工具:三劍客 都支援。

1.3  正規表示式與萬用字元的比較

       1)正規表示式應用非常廣泛,存在於各種語言中,php perl python grep sed awk 支援。ls* 萬用字元。

       2)但現在學的是Linux中的正規表示式,最常應用正規表示式的命令是grep(egrep)、sed、awk-->正規表示式通常只有awk、sed、grep能使用

       3)正規表示式和萬用字元有本質區別.

       4)萬用字元例子 ls file *.log  filef.log  grep "e*" e ee eeee  ef

           正規表示式用來找:【檔案】內容,文字,字串。高階貨,三劍客。

          萬用字元用來找什麼:檔名(*.txt),或找檔案,普通命令都支援。

        5)不需要思考的判斷方法:在三劍客awk、sed、grep egrep 都是正則,其他都是萬用字元。

        6)區分萬用字元和正規表示式最簡單的方法:

              檔案[目錄]名-->萬用字元----->ls *.txt

              檔案內容(字串,文字,【檔案】內容)-->正規表示式 grep "oldboy" oldboy.txt

        7)萬用字元和正規表示式都有“ *”、“ ?”、“ []”,但是萬用字元的這些符號都能自身代表任意字元,而正規表示式的這些符號只能代表這些符號前面的字元。

1.4   正則的分類:

                     基礎正規表示式  (BRE basic regular expression)

                     擴充套件正規表示式  (ERE extended regular expression)

       注意:

              中英文

[root@oldboyedu-lnb ~]# # ‘’ “” () 。 * …… ¥ | {}  【.
[root@oldboyedu-lnb ~]#   '' ""  ()  .  * ^   $ | {}  []
 

       grep的別名 --colorcentos7.X 系統預設存在的

                                       在centos6.X 系統是不存在的

       在centos6.x過濾內容的時候 不會顯示顏色 如何處理:

vim /etc/profile
alias grep='grep --color'
使用grep命令來測試正規表示式:
grep ' ' file

                                                       第2章         grep的用法

2.1 什麼是grep、egrep和fgrep

  1. Linux系統中grep命令是一種強大的文字搜尋工具,它能使用正規表示式搜尋文字,並把匹配的行列印出來(匹配到的標紅)。grep全稱是Global Regular Expression Print,表示全域性正規表示式版本,它的使用許可權是所有使用者。

  2. grep的工作方式是這樣的,它在一個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被引用,模板後的所有字串被看作檔名。搜尋的結果被送到標準輸出,不影響原檔案內容。

  3. grep可用於shell指令碼,因為grep通過返回一個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果搜尋的檔案不存在,則返回2。我們利用這些返回值就可進行一些自動化的文字處理工作。

  4. egrep = grep -E:擴充套件的正規表示式 (除了< , > , \b 使用其他正則都可以去掉\)

  5. fgrep=grep -F:不支援正規表示式,可以過濾普通的字串

    作用:文字搜尋工具,根據使用者指定的“模式”對目標文字逐行進行匹配檢查;列印匹配到的行 模式:由正規表示式字元及文字字元所編寫的過濾條件 用法:grep [OPTIONS] PATTERN [FILE...]                                             

   作用:文字搜尋工具,根據使用者指定的“模式”對目標文字逐行進行匹配檢查;列印匹配到的行
   模式:由正規表示式字元及文字字元所編寫的過濾條件
   用法:grep [OPTIONS] PATTERN [FILE...]

   選項:

--color=auto: 對匹配到的文字著色顯示`
-v: 顯示不被pattern匹配到的行`
-i: 忽略字元大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數` -o: 僅顯示匹配到的字串 -q: 靜默模式,不輸出任何資訊 -A #: after, 後#行 -B #: before, 前#行 -C #:context, 前後各#行 -e:實現多個選項間的邏輯or關係 grep –e cat -e dog file -w:匹配整個單詞``-E:使用ERE -F:相當於fgrep,不支援正規表示式 -f file: 根據模式檔案處理

 grep實戰演練:

例一

將磁碟利用率進行倒序排序:

例二

過濾root後的一行

 [root@centos7 ~]# cat /etc/passwd | grep -nA1 root
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
You have new mail in /var/spool/mail/root

 過濾root的前一行

例三

 過濾root的前後一行

 

 例四

正則^

      ^  # 以什麼開頭  把以什麼開頭的行查詢出來

      查詢oldboy.txt文字中以m開頭的行 列印出來

 

 例五:正則$

$      #以什麼什麼結尾         把以什麼結尾的行的內容輸出

查詢oldboy.txt中以m$結尾的行

PS: cat-A在檔案的結尾處加一個結尾標誌符$符號

[root@oldboyedu-lnb ~]# cat -A oldboy.txt
I am lizhenya teacher!$
I teach linux.$

例6

過濾oldboy.txt中所有的空格

 

例7:過濾空行

 

 例8

使用grep的單引號和雙引號

單引號 看到什麼就會過濾什麼內容

 

例9

顯示行號

 

例10

  匹配任意單個字元 不匹配空行 匹配空格

[root@oldboyedu-lnb ~]# grep '.' oldboy.txt
I am lizhenya teacher!
I teach linux.

grep -o 顯示grep的匹配過程

[root@oldboyedu-lnb ~]# grep '...' oldboy.txt -o
I a
m l
izh

例11

查詢以. 結尾的行

[root@oldboyedu-lnb ~]# tr "\n" "\t" < oldboy.txt

例12

* 前一個字元出現了0次或者0次以上

grep ‘8*’ oldboy.txt -o

例13

 .*組合使用  表示所有任何符號 顯示包含空行 類似於萬用字元的*

特點: 貪婪匹配 有多少匹配多少

 

 例14

以m.*結尾的行 貪婪匹配

 

 例15

正規表示式第一坑:* 如果沒有過濾到內容 會顯示所有的內容

 

 正規表示式第二坑: .* 貪婪匹配  儘可能的去匹配  相當於萬用字元的*

正規表示式第三坑: 神奇的[]  在中括號裡的符號 大部分沒有特殊的含義  寫什麼找什麼 相當於轉譯符\

正規表示式第四坑    第一個尖號代表取反,第二個尖號代表自身符號,$代表本身含義

 

   例16

  第五個正則:  []

[abc] 相當於是一個符號 每次匹配1個字元 找出包含a或b或c

         查詢oldboy.txt 中的[abc] 內容

         查詢[a] [b] [c]

        匹配檔案中包含a或b或c的行

         使用序列的方式查詢檔案內容

 

例17

 匹配a-z  A-Z的行

 

 例18

grep的引數-i  不區分大小寫進行過濾檔案內容

 

 例19

匹配0-9的行 0 1 2 3 4 ... 9

 

 例20

過濾檔案中的大小字母 和包含數字0-9的行

grep ‘[a-z A-Z 0-9] ’ oldboy..txt  等於grep ‘[a-Z0-9]’ oldboy.txt

   PS:萬用字元中的[]中也可以寫多個條件 瞭解

 

例21

 []中的特殊符號 都相當於脫掉了馬甲 本來的含義

 

 

 例22

查詢\或者.結尾的行

 

 例23

查詢以任意單個字元加一個! 結尾的行

 

 擴充套件正則

語法格式: grep 支援普通的正規表示式

                egrep支援擴充套件的正規表示式 或者 grep -E

                egrep =grep -E

                ^ [^ ] [^abc] 取反 排除a 排除b 排除c  中括號預設不匹配空行

. 匹配任意單個字元
[] 匹配指定範圍內的任意單個字元,示例:[wang] [0-9] [a-z] [a-zA-Z]
[^] 匹配指定範圍外的任意單個字元
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字元,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字元(空格和製表符)
[:space:] 水平和垂直的空白字元(比[:blank:]包含的範圍廣)
[:cntrl:] 不可列印的控制字元(退格、刪除、警鈴...)
[:digit:] 十進位制數字 [:xdigit:]十六進位制數字
[:graph:] 可列印的非空白字元
[:print:] 可列印字元
[:punct:] 標點符號

 匹配次數:用在要指定次數的字元後面,用於指定前面的字元要出現的次數

* 匹配前面的字元任意次,包括0次
貪婪模式:儘可能長的匹配
.* 任意長度的任意字元
\? 匹配其前面的字元0或1次
\+ 匹配其前面的字元至少1次
\{n\} 匹配前面的字元n次
\{m,n\} 匹配前面的字元至少m次,至多n次
\{,n\} 匹配前面的字元至多n次
\{n,\} 匹配前面的字元至少n次

 位置錨定:定位出現的位置

^ 行首錨定,用於模式的最左側
$ 行尾錨定,用於模式的最右側
^PATTERN$ 用於模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b 詞尾錨定,用於單詞模式的右側

擴充套件正規表示式:

1)字元匹配:
-  .  任意單個字元
-  [ ]  指定範圍的字元
-  [^] 不在指定範圍的字元
-    次數匹配:
-  \* :匹配前面字元任意次
-  ?  : 0 或1次
-  \+ :1 次或多次
-  {m} :匹配m次 次
-  {m,n} :至少m ,至多n次
(2)位置錨定:
-  ^ : 行首
-  $ : 行尾
-  \<, \b : 語首
-  \>, \b : 語尾
-    分組:()
-  後向引用:\1, \2, ...
- 或者:
 a|b a或b
 C|cat C或cat
 (C|c)at Cat或cat
 (3)總結
除了\<, \b : 語首、\>, \b : 語尾;使用其他正則都可以去掉\。

        顯示基名

        顯示目錄名:兩次的grep為了處理兩次/

       1.  顯示除a或b或c的所有字元

 

     2.過濾檔案中不包含^或$的行 第一個^是取反 第二個是普通符號

 

       第一個擴充套件正則: + 前一個字元連續出現1次或1次以上

                                  取出包含18 8連續出現1次或1次以上的行


                                 取出連續出現的字母    

      第二個擴充套件正則:  |或者

      取出包含 lizhenya和blog的行

      排除檔案中的#和空行  /etc/selinux/config           

[root@oldboyedu-lnb ~]# egrep -v '#|^$' /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

       第三個擴充套件正則: {}

  方法一:  {n,m}前一個字元至少連續出現n最多出現m

        示例1:  8出現最少1次最多兩次     

  8出現最少2次最多3次

         方法二:  8{3} 最多顯示多少次

          示例1:  8最多顯示2次(只匹配兩次)

   第四個擴充套件正則: ()

       ()表示一個整體  反向引用/後向引用(sed 使用)

 

正確的寫法 

 錯誤的寫法: 包含lizheny或者qa的行

取出正確的身份證號碼

       []{}

      問題1

        [root@oldboy~]#
        孔 150000123874591242

       夏 222113859123487192

       趙 37142518322922103X

       大 37142X183229221032

 

  問題2:查詢18位身份證號碼對應的人

 問題3: 只查詢3714開頭的身份證號碼

       查詢3714開頭的身份證號碼

 

                   使用正則獲取當前系統的IP地址 

[root@oldboyedu-lnb ~]# ifconfig eth0|head -n2
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255
[root@oldboyedu-lnb ~]# ifconfig eth0|head -n2|tail -1
inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255
[root@oldboyedu-lnb ~]# ifconfig eth0|grep inet
inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255
inet6 fe80::20c:29ff:fe7d:ce  prefixlen 64  scopeid 0x20<link>
[root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'
inet 10.0.0.200  netmask 255.255.255.0  broadcast 10.0.0.255
方法一: [root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '[0-9.]+' -o
          10.0.0.200
          255.255.255.0
          10.0.0.255
方法二:[root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '[0-9]+.[0-9]+.[0-9]+.[0-9]+' -o
         10.0.0.200
        255.255.255.0
         10.0.0.255
 [root@oldboyedu-lnb ~]# ifconfig eth0|grep '\binet\b'|egrep '([0-9]{1,3}.){3}[0-9]+' -o
         10.0.0.200
         255.255.255.0
         10.0.0.255

 

 

相關文章