Linuxgrep和正則表達

一、什麼是正則表達式

正則表達式就是爲了處理大量的文本|字符串而定義的一套規則和方法
它主要用於字符串的模式分割、匹配、查找及替換操作,其中最爲重要作用是匹配。
在Linux系統中最常用正則表達式的命令是grep(egrep),sed,awk

二、正則表達式與通配符

正則表達式分爲兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep 工具支持基本正則表達式,egrep支持擴展正則表達式,並且grep的-E選項其實就是egrep
grep語法
grep [OPTIONS]VPATTERN [FILE...] 這裏只列出了幾個常用的選項
--color 高亮顯示匹配到的字符(centos7默認開啓,centos6裏需手動添加,可以添加別名便於過濾匹配
alias egrep ='egrep --color=auto'
alias grep ='grep --color=auto')
-v 反向搜索
-i 忽略大小寫
-n 顯示行號
-c 不顯示搜索結果,僅顯示匹配的行數
-o 僅顯示匹配到的字符串
-q 靜默輸出
-A # 顯示搜索行及其向下相臨的#行
-B # 顯示搜索行及其向上相臨的#行
-C # 顯示搜索行及其向上和向下相臨的#行
-e char1 -e char2 [-e charN] 多個選項間or關係
-w 匹配整個單詞
-E 或egrep 支持擴展正則表達式
-F 或fgrep 不支持正則表達式
字符匹配

  1. 通配符
元字符 作用
* 匹配0個或任意多個字符,也就是可以匹配任何內容
表示任意一個單一字符
[ ] 匹配[ ]中任意一個字符
[-] 匹配括號中任意一個字符,-代表一個範圍,例如:[a-z]代表匹配一個小寫字母
[^] 邏輯非,表示匹配不是中括號內的一個字符,例如[^0-9]代表匹配一個不是數字的字符

2.基礎正則表達式

元字符 作用
* 前一個字符匹配0次或任意多次,匹配0次前一個字符則表示匹配任意字符,包括空白行反倒是
. 匹配除了換行符以外任意一個字符,“.”匹配所有內容
^ 用於指定匹配字符串的頭部,也稱行首定位符;匹配行首。例如:^hello會匹配以hello開頭的行,grep -n “^$” test.txt匹配空白行並顯示行號
$ 用於指定匹配字符串的尾部,也稱行尾定位符;匹配行尾。例如:hello$會匹配以hello結尾的行
[ ] 匹配中括號中指定的任意一個字符,只匹配一個字符,要匹配[則要轉義[
[^] 匹配除中括號的字符以外的任意一個字符
|轉義符用於取消特殊符號的含義,匹配包含以.結尾的行grep “.$” test.txt
{n} 表示其前面的字符恰好出現n次。例如:[0-9]{4}匹配4位數字,但注意添加兩邊的定界符,以精確匹配
{n,} 表示其前面的字符出現不小於n次。例如:[0-9]{2,}匹配2位以上的數字
{n,m} 表示其前面的字符至少出現n次,最多出現m次。例如:[a-z]{6,8}匹配6到8位的小寫字母

這裏我們要注意的是“?”“()”是擴展正則的元字符,在正則表達式中使用這些元字符如[ ]、{}、?、()、.等要在這些元字符前加“\”轉義。

3.字符類

元字符 作用
[0-9] 表示數字範圍
[a-Z] 表示所有字母
[mage] 表示包含m或a或g或e
[^mage] 表示不包含m或a或g或e
[:digit:] 表示任意數字
[:upper:] 表示大寫字母
[:lower:] 表示小寫字母
[:alpha:] 表示任意字母包含大小寫
[:alnum:] 表示任意字母或數字
[:space:] 表示空格或換行
[:blank:] 表示空格
[:punct:] 表示符號

位置錨定
位置錨定:定位出現的位置
^:行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側
^:PATTERN$用於模式匹配整行
^$:空行
^[[:space:]]*$:空白行


\<
```或`\b`:詞首錨定,用戶單詞模式的左側

`\>`或`\b`:詞尾錨定,用於單詞模式的左側
\<PATTERN\>:匹配整個單詞
分組:\(\)將一個或多個字符捆綁在一起,當做一個整體進行處理,如:\(root\)\+
分組括號中的模式匹配到的內容會被正則表達式引擎記錄與內部的變量中,這些變量的命名方式爲:\1,\2,\3.......
\1:表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
示例:\(string1\+\(string2\)*\)
           \1:string1\+\(string2\)*
                     \2:string2
後向引用:引用前面的分組括號中的模式所匹配到的字符,而非模式本身
或者:`\|`
示例:`a\|b`:a或b `C\|cat`:C或cat `\(C\|c\)at`:Cat或cat

練習:
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
    cat /proc/meminfo |grep "^s\|S"
    cat /proc/meminfo |grep -i ^s
    grep ^[sS] /proc/meminfo
    grep -e ^s -e ^S /proc/meminfo

2、顯示/etc/passwd文件中不以/bin/bash結尾的行
    cat /etc/passwd  |grep -v "/bin/bash$"

3、顯示用戶rpc默認的shell程序
    grep -w "^rpc" /etc/passwd |cut -d: -f7

4、找出/etc/passwd中的兩位或三位數
    cat /etc/passwd | grep  -o "\<[[:digit:]]\{2,3\}\>"

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面存非空白字符的行
    cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]"

6、找出“netstat -tan”命令的結果中以‘LISTEN’後跟任意多個空白字符結尾的行
    netstat -tan | grep "LISTEN[[:space:]]\+$"

7、顯示CentOS7上所有系統用戶的用戶名和UID
    cat /etc/passwd |cut -d: -f1,3 | grep "\<[0-9]\{1,3\}\>"

8、添加用戶bash、testbash、basher、sh、nologin(其shell爲/sbin/nologin),找出/etc/passwd用戶名同shell名的行
    cat /etc/passwd | grep "\(^.*\)\>.*\<\1$"

9、利用df和grep,取出磁盤各分區利用率,並從大到小排序
     df | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]\+" | sort -nr
     df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr

# 三、擴展正則表達式
3.擴展正則表達式

|元字符 | 作用 |  
| -------- | -------- |
| ()     |小括號,可以將正則字符和元字符或表達式進行組合,”(book管道符desk)s”將匹配”books”或”desks”    
|?|問號,匹配0個或1個前導表達式,如”a?”匹配其他字符串或a
|\<|反斜槓+小於號,詞首定位符, “\< abc”表示所有包含以”abc”開頭的單詞的行
|\>|反斜槓+大於號,詞尾定位符, “\>abc”表示所有包含以”abc”結尾的單詞的行
|-|減號,用於指明字符範圍, “[a-c]”將匹配包含a、b和c中任意一個字符的字符串
|+|加號,匹配一個或多個前導表達式,相當於 expr{1,}
管道符|,表示“或”,即匹配其中任何一個,”book|desk”將匹配”book”或”desk”
**練習**
1、顯示三個用戶root、mage、wang的UID和默認shell
    cat /etc/passwd |egrep "^(root|mage|wang)\>"|cut -d: -f3,7

2、找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行
    egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名
    echo /etc/rc.d/init.d/functions |egrep -o "[^/]+$"

4、使用egrep取出上面路徑的目錄名
    echo /etc/rc.d/init.d/functions | egrep -o ".*/." |egrep -o ".*/"

5、統計last命令中以root登錄的每個主機IP地址登錄次數
    last |grep "^root\>" |egrep -o "([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}" |sort -nr |uniq -c

6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255
    [0-9]
    [1-9][0-9]
    1[0-9]{2}
    2[0-4][0-9]
    25[0-5]

7、顯示ifconfig命令結果中所有IPv4地址
    ifconfig | egrep "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" -o

8、將此字符串:welcome to  magedu linux 中的每個字符去重並排序,重複次數多的排到前面
    echo welcome to magedu linux | grep -o . | sort | uniq -c | sort -nr
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章