正則表達式和grep用法,及文本查看、處理工具

概念

正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),是計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些匹配某個模式的文本。(維基百科)

通俗地說:正則表達式就是處理字符串的方法。透過一些特殊符號的輔助,達到對文本文件內字符串的搜索,替代,刪除功能。通常配合grep,sed,awk,vi等支持正則表達式的工具程序使用。例如:現在有三個行文本:hello lucy. hello world. hi,hello linux.要是我們在windows記事本里面查找hello這個單詞,三個都可以查到。要是我要查詢以hello開頭的行就不行,就要用到正則表達式”^hello”就可以查找到了。

分類:

1.基本正則表達式,BRE

2.擴展正則表達式,ERE

正則表達式用途:

1.從龐大的文本信息過濾出我們需要的關鍵信息。

2.字符串的快速查找,定位,替換,刪除等

文本過濾工具grep詳解

grep:( Global search REgular expression and Print out the line.)它和sed(流編輯器),awk(文本報告生成器),被稱為linux文本處理三劍客。

grep用法:

grep [OPTIONS] PATTERN [FILE…]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

常用選項:

–color=auto 對匹配到的字符串高亮著色顯示,centos7默認,centos6要手動設定

-i ignorecase,忽略字母大小寫。

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

-v –invert-math, 反向選擇顯示不能被模式匹配到的行。

-q -quiet, –silent,靜默模式,不輸出任何信息。

-A n after ,后面可加數字,除了顯示該行外,后面的n行也顯示出來

-B n before,面可加數字,除了顯示該行外,前面的n行也顯示出來

-C n context,顯示前后各n行。

-w? 只顯示符合全字符的行

-n? 顯示行號,

基本正則表達式元字符:

字符匹配:

1? .?:匹配任意單個字符;例如,匹配/tmp/greptest文件里面字母b開頭,中間包含兩個任意字符,結尾字母是t的字符串:

正則表達式和grep用法,及文本查看、處理工具
正則表達式和grep用法,及文本查看、處理工具

2.[]:匹配指定范圍內的任意單個字符,中括號內可以指定多個字符;例如:匹配/tmp/greptest文件里面字母t開頭,中間包含1個任意字符,結尾字母是st的字符串:

正則表達式和grep用法,及文本查看、處理工具

3.?[^]:匹配指定范圍外的任意單個字符;例如:匹配/tmp/greptest文件里面字母oo前面不是小寫字母的字符串:

[root@dxlcentOS ~]# grep -n ‘[^[:lower:]]oo’ /tmp/greptest? ? 方法一

正則表達式和grep用法,及文本查看、處理工具

[:digit:]所有數字,等于[0-9]

[:lower:]小寫字母,等于[a-z]

[:upper:]大寫字母,等于[A-Z]

[:alpha:]所有字母,等于[a-z][A-Z]

[:alnum:]所有數字和字母,等于[a-z][A-Z][0-9]

[:punct:]特殊符號字符,例如!,@,#,$等

[:space:]空白字符,包括空格、tab、換行、分頁符

字符匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數;默認工作于貪婪模式;

1.? *:匹配其前面的字符任意次;0,1,多次;例如:匹配/tmp/greptest文件里面字母g前面跟o和g任意次

正則表達式和grep用法,及文本查看、處理工具

2? ? .*:匹配任意長度的任意字符。例如:匹配/tmp/greptest文件里面字母g和g之間出現的任意字符

正則表達式和grep用法,及文本查看、處理工具

3.? \?:匹配其前面的字符0次或1次;即其前面的字符是可有可無的;

正則表達式和grep用法,及文本查看、處理工具

4. \+:匹配其前面的字符1次或多次;即其面的字符要出現至少1次;例如:

正則表達式和grep用法,及文本查看、處理工具

5.? \{m\}:匹配其前面的單個連續出現字符m次;例如:匹配/tmp/greptest文件里面重復出現3次的字母o

正則表達式和grep用法,及文本查看、處理工具

6.? \{m,n\}:匹配其前面的單個字符連續出現至少m次,至多n次;例如:匹配/tmp/greptest文件里面重復出現最少3次,最多4次的字母o

正則表達式和grep用法,及文本查看、處理工具

7.? \{0,n\}:匹配單個字符連續出現至多n次。得出的匹配結果是有一個字母o都匹配,比較亂。

正則表達式和grep用法,及文本查看、處理工具

8.? \{m,\}:匹配前面單個字符至少m次,例如匹配字符o連續出現最少5次

正則表達式和grep用法,及文本查看、處理工具

字符位置錨定:

1.^:行首錨定;用于模式的最左側的單詞或字符;例如:匹配/tmp/greptest文件里面行首是the開頭的行。

[root@dxlcentOS ~]# grep -n ‘^the’ /tmp/greptest

12:the symbol ‘*’ is represented as start.

24:the kiio pooo

匹配/tmp/greptest文件里面行首是小寫字母開頭的行

[root@dxlcentOS ~]# grep -n ‘^[a-z]’ /tmp/greptest

2:apple is my favorite food.

4:this dress doesn’t fit me.

10:motorcycle is cheap than car.

2.$:行尾錨定;用于模式的最右側;例如:匹配/tmp/greptest文件里面ww字符結尾的行

[root@dxlcentOS ~]# grep -n “ww$” /tmp/greptest

26:these iisufu www

3.? ^PATTERN$:用于指定的PATTERN來匹配整行;例如:匹配/tmp/greptest文件里面以TH開頭的行

正則表達式和grep用法,及文本查看、處理工具

4.^$:空白行;

[root@dxlcentOS ~]# grep -n ‘^? ?/tmp/functions | wc -l

87

[root@dxlcentOS ~]# grep -n ‘^$’ /tmp/functions

6:

8:

…….

5.? ^[[:space:]]*$:匹配空行或包含空白字符的行;例如:匹配/tmp/greptest文件里面的空行

正則表達式和grep用法,及文本查看、處理工具

單詞匹配:不包含特殊字符,由字母組成的連續字符(字符串)都稱為單詞;

1.? \< 或 \b:詞首錨定,用于單詞模式的左側;例如匹配字母kii開頭的單詞

正則表達式和grep用法,及文本查看、處理工具

2.? \> 或 \b:詞尾錨定,用于單詞模式的右側;例如

正則表達式和grep用法,及文本查看、處理工具

3.? \<模式\>:匹配完整單詞;例如,匹配good這個單詞

正則表達式和grep用法,及文本查看、處理工具

練習:

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

[root@dxlcentOS ~]# grep -v? “/bin/bash$” /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

2、找出/etc/passwd文件中的兩位數或三位數;

[root@dxlcentOS ~]# grep? “\b[0-9]\{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

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

~]# grep? “^[[:space:]]\+[^[:space:]]”? /etc/grub2.cfg

正則表達式和grep用法,及文本查看、處理工具

4、找出”netstat -tan”命令的結果中以’LISTEN’后跟0、1或多個空白字符結尾的行;

正則表達式和grep用法,及文本查看、處理工具

~]# netstat -tan | grep? “LISTEN[[:space:]]*$”

分組及引用

\(\):分組。

這個概念思考了很久,比較難描述,用實例說明:

正則表達式和grep用法,及文本查看、處理工具

在/tmp/fenzu文件里里面,執行[root@dxlcentOS ~]# grep “dogo\{2\}” /tmp/fenzu,\{2\}是匹配前面的字符o兩次,如果我要匹配連續出現的dogdog怎么做?

這個時候,就需要用到分組了,把dog分作一組,作為一個字符串的整體進行匹配就可以了。

正則表達式和grep用法,及文本查看、處理工具

上圖所示:\(dog\)表示將dog作為一個字符串整體,\{2\}影響的字符就是前面的dog這個字符串整體。

\(dog\)\{2\}? 這個正則表達式表示dog字符串連續出現兩次,dogdog。

所以 \(? ?\)就是分組。括號內的內容看做一個整體,一個分組進行匹配。通俗地理解就是把多個字符串用括號括起來,組成一個整體進行匹配。

后向引用:前提示前面有了分組才能進行。

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

\1:模式從左側起,表示引用整個正則表達式第一個分組中的正則所匹配的結果

\2:模式從左側起,表示引用整個正則表達式第2個分組中的正則所匹配的結果

\3

概念理解難懂,還是通過實例說明:在/tmp/yiny文件有如下內容,

He loves his lover.

He likes his lover.

She likes her liker.

She loves her liker.

假如我要匹配like和love 這倆個單詞:

正則表達式和grep用法,及文本查看、處理工具

現在我改變需求了,我要把his和her前后的like和love都相同的行取出來,可以這樣做:

正則表達式和grep用法,及文本查看、處理工具
正則表達式和grep用法,及文本查看、處理工具

所以,后向引用通俗理解就是匹配前后一樣的字符串。\(l..e\),\(like\) 表示分組 。 把前面分組后的匹配結果再引用一次。? \1? 表示后向引用。? ? .* 表示love和like中間的任意字符。\(l..e\)匹配到love后,\1就引用了love;\(like\)匹配到like后,\1就引用了llike。這就是后向引用。

擴展正則表達式egrep:

支持擴展的正則表達式實現類似于grep文本過濾功能;grep -E

egrep [OPTIONS] PATTERN [FILE…]

選項:

-i, -o, -v, -q, -A, -B, -C ,和基本grep沒什么區別。

-G:支持基本正則表達式

擴展正則表達式的元字符:

字符匹配:

.:任意單個字符

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

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

次數匹配:

*:任意次,0,1或多次;

?:0次或1次,其前的字符是可有可無的;

+:其前字符至少1次;

{m}:其前的字符m次;

{m,n}:至少m次,至多n次;

{0,n}? 表示之前出現的字符至少連續出現0次,最多n次才會被匹配到。

{m,}? 表示之前出現的字符至少連續出現m次才會被匹配到。

位置錨定

^:行首錨定;

$:行尾錨定;

\<, \b:詞首錨定;

\>, \b:詞尾錨定;

分組及引用:

():分組和基本正則表達式用法相同

后向引用:\1, \2, …

| 或:“|” 在擴展表達式中表示或

a|b:a或者b;

C|cat:C或cat

(c|C)at:cat或Cat

(com|net)表示com或net

例如:

正則表達式和grep用法,及文本查看、處理工具

總結:擴張正則和基本正則的元字符用法差不多,區別就是擴張正則對于小括號和花括號不用逃脫符\,閱讀和使用起來簡明一些。

綜合練習:

1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實現方式;

~]# grep -i “^s” /proc/meminfo

~]# grep “^[sS]” /proc/meminfo

~]# grep -E “^(s|S)” /proc/meminfo

[root@dxlcentOS ~]# egrep? “^(s|S)” /proc/meminfo

SwapCached:? ? ? ? ? ? 0 kB

SwapTotal:? ? ? 2097148 kB

2、顯示當前系統上root、centos或user1用戶的相關信息;

~]# grep -E “^(root|centos|user1)\>” /etc/passwd

[root@dxlcentOS ~]# grep -E “^(root|centos|user1)” /etc/passwd

3、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個小括號的行;

[root@dxlcentOS ~]# egrep -o “[[:alnum:]]+\(\)” /etc/rc.d/init.d/functions

正則表達式和grep用法,及文本查看、處理工具

4、使用echo命令輸出一絕對路徑,使用egrep取出基名;

~]# echo /etc/sysconfig/ | grep? -E? -o? “[^/]+/?$”

進一步:取出其路徑名;類似于對其執行dirname命令的結果;

5、找出ifconfig命令結果中的1-255之間的數值;

~]# ifconfig | grep? -E? -o? “\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>”

6、取出ifconfig命令結果中的IP地址;

正則表達式和grep用法,及文本查看、處理工具

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

正則表達式和grep用法,及文本查看、處理工具

“^([^:]+\>) ” 錨定行首,冒號除外的第一個單詞后進行分組? ? ?.* 表示中間跟任意字符。\1$表示分組后在尾位進行匹配和行首相同的單詞。

fgrep:不支持正則表達式快速搜索

在一些幾萬行,非常龐大的文本里面搜索速度很快。

常用的文本查看及處理工具命令:wc, cut, sort, uniq, diff, patch

1.wc? ? (Word Count)命令的功能為統計指定文件中的字節數、字數、行數,并將統計結果顯示輸出。

用法: wc [選項]? file…

常用選項:

-c 統計字節數。

-l?統計行數。

-w?統計字數。一個字被定義為由空白、跳格或換行字符分隔的字符串。

2.cut? ?對文件進過分析,通用指定分隔符,取出我們想要的內容。

用法:cut? [選項]? ?file…

-d? “指定的分隔符”:

-f? ?“指定的單個字段,用數字n表示,也可以取出多個字段,n1-n2,也可以取出分散的字段,用逗號隔開,n1,n2…”

例如:取出/etc/passwd文件第一到三字段內容

正則表達式和grep用法,及文本查看、處理工具

3.sort 文本內容排序命令

用法:sort? [選項]? file…

(多個文件時會內容會組合一起在屏幕輸出)

常用選項:

-u? ?去除連續重復且相同的行

-k? 指定第幾列進行排序

-t 指定分隔符進行排序

-n 按數值大小排序

-r 逆向排序

-f? 忽略大小寫

例如:對ppp。txt文件第二列和第三列文件進行排序

正則表達式和grep用法,及文本查看、處理工具

4,uniq? 報告或忽略重復的行,對相鄰的重復的行起作用

用法:uniq [選項] 文件

常用選項:

-c? 顯示沒行重復次數

-d 僅顯示重復的行

-u? 顯示沒有重復過的行

5,diff命令? 比較兩個文件或目錄內內容,找到有改動的地方

用法:diff? ?[選項]? [舊文件1或目錄1]? ? [新文件2或目錄2]

常用選項:

-u? 以合并的方式顯示文件的內容不同

例如:比較、tmp/functions 和/etc/rc.d/init.d/functions連個文件的不同

[root@dxlcentOS tmp]# diff -u functions /etc/rc.d/init.d/functions

— functions? 2017-10-21 17:57:03.359125204 +0800

+++ /etc/rc.d/init.d/functions? 2017-05-03 18:17:50.000000000 +0800

@@ -681,12 +681,11 @@

“x$1” = xforce-reload -o \

“x$1” = xcondrestart ] ; then

+? ? ? ? systemctl_redirect $0 $1

exit $?

-hhhh

+? ? fi

fi

-strstr “ss(cat /proc/cmdline)” “rc.debug” && set -x

+strstr “$(cat /proc/cmdline)” “rc.debug” && set -x

return 0

-DGDGDGDD

說明:— 開頭表示舊文件,+++ 開頭表示新文件。@@ -681,12 +681,11 @@表示要修改的位置。+表示新文件內容。 -表示舊文件內容

6. patch命令 向文件打補丁

補丁文件創建通常由: # diff? /PATH/TO/OLDFILE? /PATH/TO/NEWFILE > /PATH/TO/P_FILE? 創建。修改好后就可以向舊文件打補丁。

打補丁方法:

方法1:# patch [OPTIONS] -i /PATH/TO/P_FILE /PATH/TO/OLDFILE

方法2:patch /PATH/TO/OLDFILE < /PATH/TO/P_FILE

如果要取消補丁做出的更改,恢復舊版本:

patch? ?-E? ? /PATH/TO/OLDFILE < /PATH/TO/P_FILE

-E :取消打補丁。

注:以上練習在centos7下進行。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87978

(0)
N27_dxldengN27_dxldeng
上一篇 2017-10-21
下一篇 2017-10-21

相關推薦

  • Linux 任務計劃、周期性任務執行

    Linux 任務計劃、周期性任務執行 概述:      什么是任務計劃呢?就像我們每個人日常生活中都會使用到的鬧鐘一樣,按時的去提醒該去做什么事情,以免忘記。同樣,我們在工作當中也要在每天在特定的時間內安排做一些事情,這就是任務計劃,本章將學習如何制定Linux系統的任務計劃,這里主要包括兩種工具:at和crontab…

    Linux干貨 2016-09-11
  • N23_第五周

    1.顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行 egrep “^[[:space:]]{1,}” /boot/grub/grub.conf 2.顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行 egrep “^#[[:space:]]{1,}.*[^[:space…

    Linux干貨 2017-02-27
  • 用戶、組及文件相關的一些命令

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限。 cp -r /etc/skel /home/tuser1,因為是目錄文件所以要有-r ls -ld /etc/skel chmod 000 -R /home/tuser1 ls -al /home/tuser1/ 2、編輯/…

    2017-07-23
  • Nginx 進階 (ssl、fpm、rewrite、cache配置等)

    Nginx(與ssl結合配置https網站、rewrite,fastcgi配置詳解) 前言 前面已經介紹過Nginx的一些基礎概念,還有幾個比較重要的模塊:利用ssl給會話加密,利用rewrite功能靈活改寫訪問結果,以及利用fastcgi與php模塊結合等等。 一、配置https網站 1、自建CA (1)生成私鑰文件 mkdir -p /etc/pki/C…

    Linux干貨 2016-12-26
  • 腳本編程之循環:for,while,until

    shell中的循環語句一般有: for   while   until 一、for     for 變量名 in 列表;do         循環體     d…

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