文本處理三劍客-grep及正則表達式初

什么是正則表達式

基本正則表達式的元字符

擴展正則表達式

grep的基本理解

grep的基本選項

grep的應用實例

什么是正則表達式

 

正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexpRE),計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式的文本。(摘自百度百科)

個人理解:正則表達式是由一些特殊字符及文本所標寫的一種模式,通過搭配文本處理工具來搜索文本并將匹配數據打印出來。

  正則表達式分類

基本的正則表達式(Basic Regular Expression 又叫vfr Basic RegEx  簡稱 BRE

擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 ERE

引擎:采用不同算法,檢查處理正則表達式的軟件模塊



基本正則表達式的元字符

字符匹配

.        單個字符
[]       匹配任意字符以內范圍
[^]      匹配任意字符以外的的范圍(取反)
[:digit:]匹配任意數字
[:lower:]匹配任意小寫字母
[:upper:]匹配任意大寫字母
[:alpha:]匹配任意大小寫字母
[:space:]匹配任意空白或空格
[:punct:]匹配所有標點符號
[:alnum:]匹配所有字母和數字

 次數匹配

*匹配前一個字符的0到任意次
.*任意字符的任意長度
\?匹配前面的字符0-1次
\+匹配前面字符的1次以上包括1次
\{n\}匹配前面字符n次
\{m,n\}匹配前面字符最少m,最多n次
\{,m\}最少m次
\{m,\}最多m次

 

位置錨定  

^行首
$行尾
^$空行
\<詞首錨定   \>詞尾錨定
\b詞首錨定   \b詞尾錨定
\<匹配整個單詞\>

 

分組  

  將一個或多個字符綁定在一起作為一個整體處理

\(\)

例如:\(root\) 匹配一行中所有為root字符的組

例如:ab*c

 表示的是b的任意次而不是說是ab的任意次,要實現這一功能,就可以使用分組\(ab\)*c

 

分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部變量中,這些變量為:

\1:模式從左側開始,第一個左側括號以及與之匹配的右括號之間的模式所匹配到的字符

\2:模式從左側開始,第二個左側括號以及與之匹配的右括號之間的模式所匹配到的字符

括號可以內嵌但不能交叉

 



擴展正則表達式

擴展正則表達式的用法

erep -Eegrep

 

擴展正則表達式的元字符

字符匹配

.任意單個字符
[]指定范圍內的字符
[]不在范圍內的字符,取反

 

次數匹配

*匹配前面字符的任意次
?匹配前面自0次或1次
+匹配前面字符至少1次以上包括1次
{n}匹配n次
{n,m}匹配至少n次最多m次

 

位置錨定

^行首
$行尾
^$空行
\<,\b:句首
\>,\b:句尾
 或者使用|
A|b:A或b

 



grep的基本理解

文本搜索工具,通過正則表達式及文本字符編寫的過濾條件進行搭配來對文本進行匹配檢查,打印匹配并輸出結果。



grep基本選項

grep -i 不區分大小寫
grep -v 取反
grep -n 顯示行號
grep -c 顯示匹配的有多少行
grep -o 只顯示匹配的字符或其他
grep -q 靜默模式 就是不顯示匹配的結果,什么都不顯示
用echo %?得出上一條命令的結果
0為正確輸出
非0位錯誤的命令輸出
grep -A {number}匹配結果行后幾行
grep -B {number}匹配結果前幾行
grep -C {number}匹配結果的前后幾行
grep -e 關鍵字 -e 關鍵字 多個關鍵字作為匹配條件(不限制說一定要匹配前后,匹配前后其中一個)
grep -w 匹配整個單詞不包含包括

grep的應用實例

1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)

[root@localhost ~]# grep -i "^s" /proc/meminfo 
SwapCached:           64 kB
SwapTotal:       2097148 kB
SwapFree:        2091288 kB
Shmem:              6016 kB
Slab:             228152 kB
SReclaimable:     153116 kB
SUnreclaim:        75036 kB
[root@localhost ~]# grep -e "^S" -e "^s" /proc/meminfo 
SwapCached:           64 kB
SwapTotal:       2097148 kB
SwapFree:        2091288 kB
Shmem:              6016 kB
Slab:             228152 kB
SReclaimable:     153116 kB
SUnreclaim:        75036 kB

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

[root@localhost ~]# 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
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
halt:x:7:0:halt:/sbin:/sbin/halt
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
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

3、顯示用戶rpc默認的shell程序

[root@localhost ~]# grep "\brpc\b" /etc/passwd |cut -d: -f7
/sbin/nologin

4、找出/etc/passwd中的兩位或三位數

[root@localhost ~]# grep "\b[[:digit:]]\{2,3\}\b" /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
nobody:x:99:99:Nobody:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin

5、顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行

[root@localhost ~]# 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
  if [ -z "${boot_once}" ];

6、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行

[root@localhost ~]# netstat -tan |grep "LISTEN[[:space:]]*$"
tcp        0      0 192.168.122.1:53        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     
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
tcp6       0      0 ::1:6010                :::*                    LISTEN

7、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行

[root@localhost testdir]# grep "^\(\<.*\>\).*/\1$"  passwd 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1001:1001::/home/bash:/bin/bash
nologin:x:1004:1004::/home/nologin:/sbin/nologin

原創文章,作者:snowbamboo,如若轉載,請注明出處:http://www.www58058.com/29854

(0)
snowbamboosnowbamboo
上一篇 2016-08-07 22:05
下一篇 2016-08-07 22:05

相關推薦

  • MySQL流程函數

    MySQL流程函數 IF(value,x y) 如果value是真,返回x,否則返回y MariaDB [learn]> INSERT INTO salary(sal) VALUES (1000),(2000),(3000),(4000),(5000),(6000),(NULL); Query OK, 7 rows affected (0.06 sec…

    Linux干貨 2017-05-02
  • 優云Monitor:開啟數據中心主機運維的上帝視角

    常常有這么一句話在激勵每一位運維人員,“不以故障多為恥,而以恢復快為榮。”運維人員就是要快速定位問題,分析問題,排除故障,快速恢復來保障生產業務不受中斷。然而,現代大型數據中心,運維人員要管理的系統節點比以前繁多,為了掌控數據中心的實時運行情況與定位問題,需要花的時間成本已經長得無法接受。 而優云Monitor給運維人員提供了極好的可視化手段,能夠讓運維人員…

    系統運維 2017-01-09
  • 通過webGUI顯示日志信息

         日志信息通常對于我們維護人員有著極為重要的意義,能夠為我們提供故障排查、運維監控、歷史操作記錄等等很多必要的信息。為了方便此類信息的獲取,我們可以搭建日志服務器,并實現webGUI顯示以便更直觀形象的觀察收集它們。     一、拓撲圖         &nbs…

    Linux干貨 2015-07-15
  • 由tty命令產生的好玩的想法

    昨天看了馬哥Linux視頻的前兩天內容,里面講了到終端的概念,回顧一下:  物理終端:是直接接入本機的顯示器和鍵盤設備。/dev/console  虛擬終端:附加在物理終端之上的以軟件方式虛擬實現的終端,CentOS 6默認啟動6個虛擬終端 Ctrl+Alt+F#: [1,6] 圖形終端:附加在物理終端之上的以軟件方式…

    Linux干貨 2016-05-16
  • 馬哥教育網絡班22期第一周課程練習1-3天

    1.描述計算機組成及其功能 CPU:  運算器  控制器  寄存器  緩存 存儲器:  RAM(隨機訪問存儲器)  I/O設備:               i:下指令,提供數據 如:鍵鼠     &…

    Linux干貨 2016-08-15
  • bash腳本編程之流程控制if、for、while、until簡介

    概述     之前介紹了一些bash腳本編程的變量、運算、條件測試的一些基礎內容,了解了腳本實際上就是一些語句加上一些流程控制組合起來,實現某種功能的可執行文件。我們知道,條件測試的目的,實際就是為了實現一種流程的控制,那么本篇就簡單介紹一下bash里面常見的流程控制語句,包括選擇、循環等內容,具體包括以下幾個部分: …

    Linux干貨 2016-08-18
欧美性久久久久