1. 程式人生 > >【Linux相識相知】文本處理工具之grepegrepfgrep及正則表達式

【Linux相識相知】文本處理工具之grepegrepfgrep及正則表達式

搜索字符串 變量 git cnblogs game home 表示 leg roo

常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。

grep

NAME:打印模式匹配的行
SYNOPISIS:
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
常用選項:
--color=auto:對匹配到的文本著色後進行高亮顯示,默認已被別名alias grep=grep --color=auto
-i:忽略字符的大小寫
-o:僅顯示匹配到的字符串本身
-v:顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式 -q:靜默模式,即不輸出任何信息 -A #:顯示被模式匹配的行及其後#行 -B #:顯示被模式匹配的行及其前#行 -C #:顯示被模式匹配的行及其前後各#行

舉例1:匹配/etc/passwd下有frank的行

[[email protected] tmp]# grep "frank" /etc/passwd
frank:x:1000:1000:frank:/home/frank:/bin/bash

舉例2:匹配/etc/passwd下有frank的行,忽略大小寫

[[email protected] tmp]# grep
-i "frank" /etc/passwd frank:x:1000:1000:frank:/home/frank:/bin/bash Frank:x:1001:1001::/home/Frank:/bin/bash

舉例3:匹配/etc/passwd下不能被bash匹配的行

[[email protected] tmp]# grep -v "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
lp:x:4:7
:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ...... pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin

舉例4:僅僅匹配/etc/passwd下的frank,忽略大小寫

[[email protected] tmp]# grep -oi "frank" /etc/passwd
frank
frank
frank
Frank
Frank

舉例5:靜默模式匹配含有frank的行

[[email protected] tmp]# grep -q "frank" /etc/passwd
[[email protected] tmp]# 

舉例6:匹配/etc/passwd下含有ftp的行及其後3行

[[email protected] tmp]# grep -A 3 "ftp" /etc/passwd
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

舉例7:匹配/etc/passwd下含有ftp的行及其前3行

[[email protected] tmp]# grep -B 3 "ftp" /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
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

舉例8:匹配/etc/passwd下含有ftp的行及其前後各2行

[[email protected] tmp]# grep -C 2 "ftp" /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin

egrep

支持擴展正則表達式實現類似於grep的文本過濾功能,相當於grep -E

NAME:打印模式匹配的行
SYNOPISIS:
        egrep [OPTIONS] PATTERN [FILE...]   
-i:忽略字符的大小寫
-o:僅顯示匹配到的字符串本身
-v:顯示不能被模式匹配到的行
-q:靜默模式,即不輸出任何信息
-A #:顯示被模式匹配的行及其後#行
-B #:顯示被模式匹配的行及其前#行
-C #:顯示被模式匹配的行及其前後各#行
-G:支持基本正則表達式

fgrep

fgrep搜索字符串而不是搜索匹配的表達式的模式,所以支持正則表達式,當無需要用到元字符去編寫模式的時候,使用fgrep必能更好更快。

支持-i,-v,-o,-A,-B,-C,-p等選項

正則表達式

Regular Expression,正則表達式,由一類特殊字符及文本字符編寫的模式,其中有些不表示其字面的意義,而是用戶控制或通配功能,分為基本正則表達式和擴展正則表達式。

基本正則表達式元字符:

字符匹配

. :匹配任意單個字符;
[]:匹配指定範圍內的任意單個字符;
      特殊匹配:[:digit:] 匹配任意單個數字
                        [:lower:] 匹配任意單個小寫字母
                        [:upper:] 匹配任意單個大寫字母
                        [:alpha:] 匹配任意單個字母
                        [:alnum:] 匹配任意單個字母或數字
                        [:punct:] 匹配任意單個符號
                        [:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字符;

匹配次數

用在要指定其出現的次數的字符後面,用於限制其前面字符出現的次數,默認工作於貪婪模式

*:匹配其前面的字符任意次數:0,1,多次
      .*:匹配任意長度的任意字符
\?:匹配其前面的字符0次或者1次;
\+:匹配其前面的字符1次或者多次;
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
        \{m,\}:至少m次

位置錨定

^:托字符,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側

單詞:非特殊字符組成的連續字符(字符串)都稱為單詞

\<或\b:詞首錨定,用於單詞模式的左側
\>或\b:詞尾錨定,用戶單詞模式的右側
\<PATTERN\>:匹配完整單詞

分組及引用

分組:
\(\):將一個或多個字符捆綁在一起,當做一個整體進行處理
後向引用:引用前面的分組括號中的模式所匹配到的字符
分組括號中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變量中:
\1:模式從左側起,第一個左括號及與之匹配的右括號之間模式匹配到的內容
\2:模式從左側起,第二個左括號及與之匹配的右括號之間模式匹配到的內容
以此類推

舉例:

1.顯示/etc/passwd文件中不以/bin/bash結尾的行

[[email protected] tmp]# 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
......
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

2.找出/etc/passwd文件中的兩位或三位數字

[[email protected] tmp]# 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
......
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

3.找出etc/grub2.cfg文件中,以至少一個空白字符開頭,且後面非空白字符的行;

[[email protected] tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 
  load_env
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
   set default="${saved_entry}"
  menuentry_id_option="--id"
  menuentry_id_option=""
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true

4.找出"netstat -tan"命令的結果中以LISTEN後跟0,1或多個空白結尾的行

[[email protected] tmp]# netstat -tan | grep  "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 

擴展正則表達式元字符:

字符匹配

. :匹配任意單個字符;
[]:匹配指定範圍內的任意單個字符;
      特殊匹配:[:digit:] 匹配任意單個數字
               [:lower:] 匹配任意單個小寫字母
               [:upper:] 匹配任意單個大寫字母
               [:alpha:] 匹配任意單個字母
               [:alnum:] 匹配任意單個字母或數字
               [:punct:] 匹配任意單個符號
               [:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字符;

匹配次數

用在要指定其出現的次數的字符後面,用於限制其前面字符出現的次數,默認工作於貪婪模式。

*:匹配其前面的字符任意次數:0,1,多次
   .*:匹配任意長度的任意字符
?:匹配其前面的字符0次或者1次;
+:匹配其前面的字符1次或者多次;
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次
   {m,}:至少m次

位置錨定

^:托字符,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側

單詞:非特殊字符組成的連續字符(字符串)都稱為單詞

\<或\b:詞首錨定,用於單詞模式的左側
\>或\b:詞尾錨定,用戶單詞模式的右側
\<PATTERN\>:匹配完整單詞

分組及引用

分組:
():將一個或多個字符捆綁在一起,當做一個整體進行處理
後向引用:引用前面的分組括號中的模式所匹配到的字符
分組括號中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變量中:
\1:模式從左側起,第一個左括號及與之匹配的右括號之間模式匹配到的內容
\2:模式從左側起,第二個左括號及與之匹配的右括號之間模式匹配到的內容
以此類推

a|b:a或b
C|cat:C或cat
(C
|c)at:cat或Cat

【Linux相識相知】文本處理工具之grep\egrep\fgrep及正則表達式