grep與正則表達式基礎

目錄linux

         grepnginx

         正則表達式git

grep用法簡介

咱們介紹GREP的用法,主要用於匹配行,咱們藉助下面的正則表達式來介紹如何使用grep,還有就是正則表達式在linux中是極爲重要的一部分。正則表達式

 1 命令:grep
 2 格式:grep [option] "pattern" filename
 3 選項:
 4          -v:反向選擇
 5          -i:忽略大小寫
 6          -n:顯示行號
 7          -c:統計行數
 8          -o:僅顯示匹配到的字符串
 9          -w:匹配整個單詞
10          -q:不輸出任何信息
11          -A 2:after 顯示後2行
12          -B 3:before 顯示前3行
13          -C 3:context 先後各3行
14          -e:實現多個選項間的邏輯關係
15                    grep -e root -e mail /etc/passwd
16          -E:至關於egrep,用於使用拓展的正則表達式
17          -F:至關於fgrep,不支持正則表達式

正則表達式(Regular expression

什麼是正則表達式shell

         Regular expression(正則表達式)是由一類特殊字符及文本字符編寫的模式,其中有些字符(元字符)不表明字符的字面意義,而表示控制或通配功能。express

那些程序支持正則表達式vim

         grepsedawkvimlessnginxvarnishbash

man中查詢less

         咱們能夠在正則man手冊中查找正則的用法ide

         man 7 regex

 

正則表達式的分類

         基本正則表達式

         擴展的正則表達式

        

元字符的分類

         字符匹配,匹配次數,位置錨定,分組

        

基礎RE(用於grep)

         字符匹配               

1    .        匹配任意單個字符
2    []       匹配指定範圍內的任意單個字符
3    [^]      匹配指定範圍外的任意字符

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

1    *           匹配前面的字符任意次(包括0次)
2    .*          任意長度的任意字符
3    \?          匹配前面的字符0次或一次
4    \+          匹配前面的字符至少一次
5    \{n\}    匹配前面的字符n次
6    \{m,n\}   匹配前面的字符至少m次,最多n次
7    \{,n\}      匹配前面的字符最多n次
8    \{n,\}      匹配前面的字符最少n次

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

1   ^            行首錨定
2   $            行尾錨定
3   ^$          空行
4   ^[[:space:]]$    空白行
5   \<,\b           詞首錨定,用於單詞模式的左側
6   \>,\b           詞尾錨定,用於單詞模式的右側
7   \<pattern\>      匹配整個單詞

         分組

                   \(\)將一個或多個字符捆綁在一塊兒,當作一個總體進行處理,如\(root\)\+

                   分組括號中的模式匹配到的內容會被正則表達式引擎記錄在內部的變量中,這些變量的命令方式爲\1,\2,\3...

                   \1     表示從左側起第一個左括號以及與之匹配的右括號之間的模式所匹配到的字

                   示例:

                            \(string1\+\(string2\)*\)

                                     \1string1\+\(string2\)*

                                     \2string2

         後向引用

                   引用前面的分組括號中的模式所匹配的字符,而非模式自己

         或者\|

                           

擴展RE(用於egrepgrep E

 

         字符匹配

1    .        匹配任意單個字符
2    []       匹配指定範圍內的任意單個字符
3    [^]     匹配指定範圍外的任意字符

         匹配次數            

1    *                匹配前面的字符任意次(包括0次)
2    ?                匹配前面的字符0次或一次
3    +                匹配前面的字符至少一次
4    {n}          匹配前面的字符n次
5    {m,n}       匹配前面的字符至少m次,最多n次

         位置錨定

1   ^ :     行首
2    $ :     行尾
3    \<, \b :  語首
4    \>, \b :  語尾                    

         分組

1     ()
2     後向引用: \1, \2, ...                      

         或者

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

         特殊字符                                    

      [:alnum:] 字母和數字
      [:alpha:] 表明任何英文大小寫字符,亦即 A-Z, a-z
      [:lower:] 小寫字母
      [:upper:] 大寫字母
      [:blank:] 水平空白字符(空格和製表符)
      [:space:] 全部水平和垂直的空白字符(比[:blank:]包含的範圍廣)
      [:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
      [:digit:] 十進制數字
      [:graph:] 可打印的非空白字符
      [:print:] 可打印字符
      [:punct:] 標點符號
      [:xdigit:] 十六進制數字                          

                                    

grep

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

cat /proc/meminfo | grep "^[sS]"
cat /proc/meminfo | grep "^[s\|S]"
cat /proc/meminfo | grep "^s\|^S"

 

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

cat /etc/passwd | grep -v "/bin/bash$"

 

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

cat /etc/passwd | grep "^rpc\>" | grep -o "[^/]\+$"
cat /etc/passwd | grep "^rpc\>" | cut -d"/" -f6

 

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

cat /etc/passwd | grep "\b[0-9]\{2,3\}\b"

 

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

cat grub2.txt | grep "^[[:space:]]\+[[:graph:]].*"

 

6、找出「netstat -tan」命令的結果中以‘LISTEN’後跟任意多個空白字符結尾的行

netstat -tan | grep "LISTEN[[:space:]]*$"

 

7、顯示CentOS7上全部系統用戶的用戶名和UID

cat /etc/passwd | cut -d ":" -f 1,3 | grep -v "\b0$" | grep "\b[0-9]\{1,3\}\b"
cat /etc/passwd | cut -d ":" -f 1,3 | grep -ve "\b0$" -e "[0-9]\{4,\}" 

 

8、添加用戶bash testbash basher sh nologin(shell/sbin/nologin),找出 /etc/passwd用戶名同shell名的行

cat /etc/passwd | grep "\(^[[:alnum:]]\+\>\).*\<\1$" 

 

9、利用dfgrepsort,取出磁盤各分區利用率,並從大到小排序

df | grep "/dev/sd" | grep -o "[0-9]\{1,\}%" | sort -nr 

egrep

一、顯示三個用戶root mage wangUID和默認shell

cat /etc/passwd | egrep "^root|^mage|^wang" | tr -s ":" "/" | cut -d"/" -f3,8
cat /etc/passwd | egrep "^root|^mage|^wang" | cut -d":" -f3,7

二、找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行 

cat /etc/rc.d/init.d/functions | egrep -o "^([[:alpha:]]+|_).*[[:graph:]]\(\)"
cat /etc/rc.d/init.d/functions | egrep -o "^.*[[:grpha:]]\(\)"
cat /etc/rc.d/init.d/functions |egrep -o "^.*\>\(\)"

三、使用egrep取出/etc/rc.d/init.d/functions中其基名 

echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/*$"
echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/?$"
echo /etc/rc.d/init.d/functions |egrep "[^/]+/?$" -o

 

 

四、使用egrep取出上面路徑的目錄名 

echo /etc/rc.d/init.d/functions | egrep -o  ".*/\<"
echo /etc/rc.d/init.d/functions |egrep -o ".*/." |egrep -o

 

 

5、統計last命令中以root登陸的每一個主機IP地址登陸次數

last | grep ^root | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c 

 

六、利用擴展正則表達式分別表示0-9 10-99 100-199200-249 250-255

echo {1..1000} | egrep -o "\b[0-9]\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b[0-9]{2}\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b1[0-9]{2}\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b2[0-4][0-9]\b" | tr "\n" " " ;echo
echo {1..1000} | egrep -o "\b25[0-5]\b" | tr "\n" " " ;echo 

 

七、顯示ifconfig命令結果中全部IPv4地址

ifconfig|egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

 

8、將此字符串: welcome to magedu linux 中的每一個字符去重並排序,重複次數多的排到前面

echo "welcome to magedu linux" | tr -d " " | grep -o "." | sort | uniq -c | sort -nr            

                      

相關文章
相關標籤/搜索