17 正則表達式及作業

17 正則表達式及作業

    因為正則表達式類型較多且比較重要,因此單獨拿出一篇進行陳述。

正則表達式是各種文本處理工具的基礎,也是shell編程必須牢牢掌握的知識,其重要性不言而喻。

一、雜項知識整理

1、一個[:space:]包括一個tab。

2、區分好文件名通配(globing)和文件內容通配(正則表達式)。

在文件名通配中[a-c]是指aAbBc,而正則表達式中是abc。

3、正則表達式中-w或錨定的時候的單詞中也包括數字,不包括特殊符號。

4、grep選項中-e表示邏輯或,但是沒有與的選項,功能可用管道等實現。

5、basename取目錄中的基名。給定路徑:

[root@localhost test]# basename /etc/init.d/functions 
functions

basename [pathname] [suffix]

basename [string] [suffix]

suffix為后綴,如果suffix被指定了,basename會將pathname或string中的suffix去掉。

[root@localhost test]# basename /etc/init.d/functions.txt .txt
functions

6、正則表達式的算法與擴展正則表達式不同,元字符分類:字符匹配,匹配次數,位置錨定,分組

二、詳細命令及事例

1、正則表達式grep:文本搜索工具,根據用戶指定的“模式PATTERN”對目標文本逐行進行匹配檢查,打印匹配到的行。

PATTERN:由正則表達式字符及文本字符所編寫的過濾條件。

2、grep命令選項:–color=auto:默認別名

    -v 顯示不能被模式匹配到的行

    -i 忽略字符大小寫

    -n 顯示匹配到的行在原文件中的行號

    -q 靜默模式,不輸出任何信息

    -o 僅顯示匹配到的字符串

    -c 統計匹配的行數

    -A # :after,后#行

    -B # :before,前#行

    -C # :前后#行

    -e 實現多個選項之間的邏輯或

        grep -e “aaa” -e “bbb” FILE

    -w 整行匹配整個單詞

    -E 支持擴展正則表達式

3、字符匹配:. 匹配單個任意字符

    [] 匹配指定范圍內的任意單個字符

    [^] 匹配指定范圍外的任意單個字符

    [:digit:]任意數字 [:lower:]任意小寫字母 [:upper:]任意大寫字母 [:alpha:]任意字母 [:alnum:]所有字母及數字 [:space:]所有空格,包括tab [:punct:]所有特殊字符

4、匹配次數:* 匹配前面的字符任意次,包括0次

    .* 任意長度的任意字符

    \? 匹配其前面的字符0或1次

    \+  匹配其前面的字符至少一次

    \{m\}匹配前面的字符m次,準確數值   

    \{m,n\} 匹配其前面的字符至少m次,至多n次

    \{,n\}  匹配前面的字符至多n次

    \{m,\}  匹配前面的字符至少m次

位置錨定:^ 行首錨定,用于模式的最左側

    $ 行尾錨定,用于模式的最右側

    ^PATTERN$  用于模式匹配整行

        ^$  空行

        ^[[:space:]]*$ 空白行

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

    \>或\b 詞尾錨定,用于單詞模式的右側,限定某個單詞。

    \<PATTERN\> 匹配整個單詞、

5、分組:

    \(\) 將一個或多個字符捆綁在一起,當做一個整體進行處理,如\(root\)+

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

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

        \(string\+\(string2\)*\)

        \1:string1\+\(string2\)*

        \2: string2

    第幾個變量就是第幾個左括號以及與其組合右括號中間的內容。若\(\).*\1則是一行之中同時滿足兩個模式,也就是調用前一個分組內容進行匹配。

6、擴展正則表達式:grep -E 與 egrep 相同;不同之處:

    * 匹配前面字符任意次

    ? 匹配前面字符零次或者一次

    + 匹配前面字符一次或者多次

    {m} 匹配前面字符m次

    {m,n} 匹配前面的字符至少m次,至多n次

    ( )  分組

    或者:a|b 

區別在于擴展正則表達式多了或者的邏輯模式,次數匹配和分組中沒有\。其他相同。

三、作業及練習

1、IP地址:\<(1|2)[[:digit:]]{1,2}.[0-9]{1,3}.[0-9]{1,3}.[[:digit:]]{1,3}\>

2、手機號:\<1(3|4|5|6|7|8)[[:digit:]]\{9\}\>

3、身份證號:\<[[:digit:]]\{6\}(1|2){0|9}[[:digit:]]\{2\}(0|1)[[:digit:]][0-3][[:digit:]]\{4\}(X|[[:digit:]])\>

4、郵箱:\<[[:alpha:]]\{1,20\}@[[:alpha:]]\+.com\>

5、顯示/proc/meminfo文件中以大小寫s開頭的行:

[root@localhost ~]# grep -i "\<s" /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       4050936 kB
SwapFree:        4050936 kB
Shmem:              6796 kB
Slab:              87204 kB
SReclaimable:      43816 kB
SUnreclaim:        43388 kB
[root@localhost ~]# grep -E "\<(s|S)"  /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       4050936 kB
SwapFree:        4050936 kB
Shmem:              6796 kB
Slab:              87212 kB
SReclaimable:      43848 kB
SUnreclaim:        43364 kB

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

[root@localhost ~]# grep -v "/bin/bash\>" /etc/passwd

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

[root@centos68 ~]# grep "\<rpc\>" /etc/passwd
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin

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

[root@localhost ~]# grep -o "\<[[:digit:]]\{2,3\}\>"  /etc/passwd

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

grep "^[[:space:]]\+.*[^[:space:]].*" /etc/grub2.cfg

10、找出“netstat -tan”命令的結果中以'LINSTEN'后跟0、1或多個空白字符結尾的行:

[root@localhost ~]# netstat -tan | grep "\<LISTEN\>[[:space:]]*$"
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN

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

[root@localhost ~]# grep  "^\<\(.*\)\>.*\1$"  /etc/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:2231:2231::/home/bash:/bin/bash
nologin:x:2233:2233::/home/nologin:/sbin/nologin

12、顯示當前系統root,mage或wang用戶的UID和默認shell:

[root@localhost ~]# egrep "^(root|wang)" /etc/passwd
root:x:0:0:root:/root:/bin/bash
wang:x:2234:2234::/home/wang:/bin/bash

13、找出/etc/rc.d/init.d/functions文件中行首為某單詞包括下劃線,后面跟一個小括號的行

[root@localhost ~]# egrep "^([[:alpha:]_])+\(\).*" /etc/rc.d/init.d/functions

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

[root@localhost ~]# echo  "/etc/rc.d/init.d/functions" | egrep -o "[^/]+$"
functions

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

[root@localhost ~]# echo  "/etc/rc.d/init.d/functions" | egrep -o "^.*/"
/etc/rc.d/init.d/

16、統計以root身份登錄的每個遠程主機IP地址的登錄次數。

[root@localhost ~]# last | grep root | egrep -o "[[:digit:]]+.[[:digit:]]+.[[:digit:]]+.[[:digit:
]]+" | sort | uniq -c     12 10.1.250.66
      1 10.1.255.1
      1 10.1.49.49
     48 172.18.16.71
      1 192.168.1.111

18、顯示ifconfig命令結果中所有的IPv4地址。

[root@localhost ~]# ifconfig | egrep -o "\<(1|2)[[:digit:]]{1,2}.[0-9]{1,3}.[0-9]{1,3}.[[:digit:]
]{1,3}\>"172.18.16.49
255.255.255.0
172.18.16.255
29:51:36:20
127.0.0.1
255.0.0.0

此處要是用分組來匹配則為:

[root@localhost ~]# ifconfig | egrep -o "\<(1|2)[[:digit:]]{1,2}.([0-9]{1,3}).\2.[[:digit:]]{1,3}
\>"255.255.255.0
127.0.0.1
255.0.0.0

因為分組的變量匹配只找行內兩個完全相同的PATTERN值,即使是模糊匹配也必須完全相同才能符合,因此此處IP中間兩個值為相同。注意:變量是找第一個左括號開始的地方,而不管括號作用是什么。

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

(0)
SilencePavilionSilencePavilion
上一篇 2016-08-05
下一篇 2016-08-05

相關推薦

  • iptables學習筆記

    這幾學習iptables,踩了一些坑,作下總結。 1、三表 (1)filter:默認表,處理本機數據包,包含input、output和forward (2)nat:處理源或目的IP/端口轉換,包含prerouting、postrouting、output (3)mangle:處理高級路由信息,包含prerouting、output、input、forward…

    Linux干貨 2016-06-09
  • ?LAMP

    LAMP lamp環境簡介 php –> httpd Module形式安裝php FastCGI方式安裝php httpd-2.2配置fcgi php-xcache MySQL 安裝與配置 php –> MySQL 快速部署LAMP php網站程序安裝 phpMyadmin wordpress DiscuzX 腳本安裝wordpress、disc…

    Linux干貨 2016-10-12
  • sed命令實戰

    1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符  [root@centos7 ~]# sed -r 's#^[[:space:]]+##g' /etc/grub2.cfg # # DO NOT EDIT THI…

    Linux干貨 2016-08-15
  • linux文件系統目錄結構

    FHS標準      文件和目錄被組織成一個單根的倒置樹結構 文件系統從根目錄開始用“/”表示 根文件系統:root filesystem 目錄名稱vfat格式不敏感大小寫 以.開頭的為隱藏文件 路徑分割的/ /boot:引導文件存放目錄,內核文件,引導加載器都存放此目錄 /bin:供所有用戶使用的基本命令;不能關聯到…

    Linux干貨 2016-07-29
  • 文本

    一,復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒 有任何訪問權限; cp -r /etc/skel/ /home/tuser1 chmod -R go= /home/tuser1 二,編輯/etc/group文件,添加組hadoop; vim /etc/group hadoop:x:100…

    Linux干貨 2016-11-20
  • MySQL主從復制: MHA

                    MySQL主從復制: MHA 前言 MHA的架構 環境部署 實驗步驟 總結 前言 上篇文章我們實現了MySQL的主從復制, 但是我們之前就說過, 主從復制是有很多問題的…

    Linux干貨 2016-04-28
欧美性久久久久