1. 程式人生 > >linux正則表示式

linux正則表示式

1. 正則介紹_grep

  • 什麼是正則 
    (1)正則就是一串有規律的字串,其中包括特殊字元。 
    (2)掌握好正則對於編寫shell指令碼有很大的幫助。 
    (3)各種程式語言中都有正則,原理是一樣的 
    (4)本章學習grep/egrep 、sed、awk.(熟練掌握)

grep:

gerp命令用來過濾關鍵字的。用單引號括起來關鍵詞,後面跟檔名 

在centos7中,使用grep命令自動添加了--color=auto選項,這樣過濾出來的都會帶有顏色顯示了。

(1)-c選項表示列印符合要求的行數。 

(2)-n顯示行號。 

(3)-i選項表示不區分大小寫

(4)-v

選項表示取反的意思,列印不符合要求的行 

(5)-r 表示遍歷所有的子目錄 

將/etc/目錄下所有包含root字元的檔案內容打印出來

(6)-A選項後面跟數字,過濾出符合要求的行以及下面的n行 

過濾出root行以及下面兩行

(7)-B選項後面跟數字,過濾出符合要求的行以及上面n行

過濾出root行以及上面兩行

 (8)-C選項後面跟數字,同時過濾出符合要求的行以及上下各n行。

過濾出root行以及上下兩行
  • grep/egrep在正則表示式中的應用 

(1)過濾出所有包含任意數字的行 

(2)要想打印出不包含數字的行可以加上-v選項

(3)過濾掉所有空白行和以#開頭的行

(4)過濾掉含有數字的任意一個字元 

(5)過濾掉以非數字開頭的行 

(6)^單獨跟字元或者放在方括號外面,表示以這個字元開頭。當放在方括號裡面來表示括號裡面字元的反義。也表示“非”的意思。

grep ‘r.o’ passwd //這裡的.點表示在r與o之間的任意一個字元

grep 'o*o' passwd //這裡*表示0個或者多個前面的字元

grep '.*' passwd //.*表示0個或多個任意字元,空行也包括在內。其實就是表示匹配所有字元

  • 指定要過濾出的字元出現次數。 

這裡用到了特殊符號{ },我們需要使用轉義字元\,或者使用grep 加-E選項,也可以直接使用egrep

  • 過濾出一個或多個指定的字元。 

這裡的符號+ ,表示匹配1個或多個+前面的字元。

  • grep 'o?l' paswd //這裡的?號表示前面的字元出現0次或1次。 
這裡ool將不會匹配出來
  • 過濾出字串1或者字串2或者字串3,使用  分割

egrep 'root|bash|1000' passwd //只要包含這3個字串中的一個,都會被過濾。

  • egrep中()的應用 

這裡用()表示一個整體,r()o之前可以是oo或者是at。

  • 擴充套件 

把一個目錄下,過濾所有*.php文件中含有eval的行

grep -r --include="*.php" 'eval' /data/ 

2. sed

  • grep命令還不夠強大,它只能用於查詢,而不能進行替換。這裡就需要用到sed以及awk命令了,他們能把替換的文字輸出到螢幕上,而且還有其他豐富的功能。它們都是流式編輯器。是針對文字的行來進行操作的。

(1) 打印出包含指定字串的行

sed -n '/root/'p test.txt   //打印出包含root的行

sed匹配沒有grep那麼直觀,因為它沒有顏色顯示。

(2)同時也是支援. 或者 * 和 + 

sed -nr '/o+t/'p test.txt等於 sed -n '/o\+/'p test.txt \\ 這裡的-r選項就表示不需要轉義特殊字元的意思

(3)指定要過濾出 的字元出現的次數。

sed -nr '/o{2}/'p  test.txt

(4)過濾出字串1或者字串2

sed -nr '/root|var/'p test.txt

使用-e選項,效果是一樣的

sed  -e '/root/'p  -e '/var/'p -n test.txt
如果2個要求都滿足,那麼會列印2次。

(5)列印指定的行

sed -n '3'p  test.txt  //需要列印第幾行就寫數字幾, -n選項的作用就是隻列印我們需要的那行,其他的不顯示。

列印多行可用,隔開 。例:

sed  -n '3,8'p test.txt //列印第3行到第8行
sed  -n  '3,$'p  test.txt //列印第3行到最後一行。 

(6)其他應用

sed -n '/^s/'p test.txt //打印出以s開頭的行。
sed -n  '/in$/'p  test.txt //打印出以in結尾的行
sed -n  '/.+root.+/'p   test.txt //打印出root字串在行中間的行。

(7)匹配時不區分大小寫

sed  -n   '/var/'Ip test.txt //匹配var字串,不區分大小寫。且I不能跟在-n後面

(8)刪除指定的行

sed  '3'd  test.txt  //字母‘d’就是刪除的意思,但是並不會刪除真實檔案的內容,這裡只是不顯示出來而已。要刪除真實內容,可以加上-i 選項。
sed -i '1,15'd test.txt

(9)指定性刪除

sed -i '/home/'d test.txt  //刪除包含home字串的行。
  • sed的替換功能

替換字串,與vim中的替換方式很類似。

sed '1,5s/root/toor/g test.txt //將檔案中第一到第五行中所有出現的root替換為toor
sed -r '1,5s/ro+/b/g' test.txt //將1-5行中的ro+替換為b ,加上-r選項就可以不使用轉義字元。
sed  '[email protected]/sbin/[email protected]@g'  test.txt // 不加-r選項可以將分割符換成@或者#。
head test.txt  |sed    's/[a-zA-Z]//g'  //將所有的英文字母刪除,也就是替換為空。
head |sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' test.txt  // 調換2個字串的位置,其中小括號()內看做是一個整體。將第3個括號和第1個括號內的內容調換。

在某行前新增指定內容。

sed  's/^.*$/123&/' test.txt  //檔案中所有行的行首新增123字元。這裡的&表示(^.*$/)

3. awk

awk兼具sed所有的功能,並且更加強大。它也是流式編輯器,針對文件中的行來操作。一行一行的執行。 

(1)擷取文件中的某個欄位

head -n2   test.txt  |awk  -F  ': '   '{print  $1}'  //-F用來指定分隔符。不加-F選項,預設使用空格或者tab為分隔符,print為列印的意思。 $1表示列印第1欄位   $0表示整行  

如果需要擷取多個欄位,可以在{ }中用“,”來分隔

(2)修改分隔符號

awk -F ':' '{print $1"#"$5"#"$6}' test.txt //將之前的:分隔符號替換為#,必須使用雙引號引起來。

(3)匹配功能

awk '/oo/' test.txt //匹配出現oo的行

(4)匹配某段中出現的字元

awk -F ':' '$1 ~ /oo/' test.txt

awk命令可以直接使用特殊符號而不用使用轉義字元

(5)支援多個條件匹配

awk -F ':' '/oo/ {print $1,$4} /user1/ {print $1,$6}' test.txt

(6)條件操作符

awk -F ':' '$3==0'  test.txt  //這裡表示列印第3段等於0的行,要想等於必須使用2個=,不然就是賦值了。

也可以這樣來列印:

awk -F ':' '$3>=500 {print $0}' test.txt  //第三段大於等於500

在和數字進行比較時,若把比較的數字用雙引號括起來,那麼awk不會認為是數字,而會認為是字元,那麼就會按ASCII碼錶來排序,得不到想要的結果

(7)打印出某段不等於xx的行

awk -F ':' '$7!="/sbin/nologin"  {print $0} ' test.txt //字元作為判斷條件則是要使用雙引號括起來的   !=表示不等於

(8)2欄位之間比較

awk -F ':'  '$3<$4' test.txt  //列印第3段小於第4段的行,比較的是數字
awk -F ':'  '$3==$4' test.txt //列印第3段與第4段相同的行。

(9)在2個字元之間查詢

awk -F ':' '$3>"4" && $3<"8"' test.txt //第3段大於某個字元並且小於某個字元 。這裡數字使用了雙引號,所以表示字元 
  • awk的內建變數 

(1)OFS-F選項有類似的功能,也是用來定義分隔符的,但是它是在輸出的時候定義的 

(2)變數NR的用法 表示行號

(3)變數NF表示用分隔符分隔後一共有多少段 

(4)使用NR列印前多少行 

awk -F ':' 'NR<=10' test.txt //列印前10行

(5)列印2個條件同時滿足的行 

awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt  //列印前十行裡面第一段包含root或者sync的行

(6)2個變數的應用 

(7)賦值 

賦值後沒有了分隔符號了,使用OFS重新定義

(8)求和 

awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt  //每行的第三段數字累計相加

課堂筆記:

raid5和raid6的區別:

grep -A1 :過濾當前行和下一行

去除以#開頭的行和空行

  • grep -E = egrep

練習題:

sed:

1.把/etc/passwd 複製到/root/test.txt,用sed列印所有行

答:sed -n '1,$'p test.txt

2.列印test.txt的3到10行

答:sed -n '3,10'p test.txt

3.列印test.txt 中包含 ‘root’ 的行

答:sed -n '/root/'p test.txt

4.刪除test.txt 的15行以及以後所有行

答:sed  '15,$'d test.txt

5.刪除test.txt中包含 ‘bash’ 的行

答:sed  '/bash/'d test.txt

6.替換test.txt 中 ‘root’ 為 ‘toor’

答:sed '1,$s/root/toor/g' test.txt

7.替換test.txt中 ‘/sbin/nologin’ 為 ‘/bin/login’

答:sed '1,$s/sbin\/nologin/bin\/login/g' test.txt

8.刪除test.txt中5到10行中所有的數字

答:sed  '5,10s/[0-9]//g' test.txt

9.刪除test.txt 中所有特殊字元(除了數字以及大小寫字母)

答:sed  's/[^0-9a-zA-Z]//g' test.txt  

10.把test.txt中第一個單詞和最後一個單詞調換位置

答:sed -ri 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' test.txt  

11.把test.txt中出現的第一個數字和最後一個單詞替換位置

答:sed -r 's/([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)/\1\5\3\4\2/' test.txt

12.把test.txt 中第一個數字移動到行末尾

答:sed -r 's/([^0-9][^0-9]*)([0-9][0-9]*)([^0-9].*$)/\1\3\2/' test.txt

13.在test.txt 20行到末行最前面加 ‘aaa:’

答:sed -r '20,$s/(.*)/aaa:&/' test.txt

awk:

1.用awk 列印整個test.txt (以下操作都是用awk工具實現,針對test.txt)

答:awk '{print $0}' test.txt

2.查詢所有包含 ‘bash’ 的行

答:awk '/bash/ ' test.txt

3.用 ‘:’ 作為分隔符,查詢第三段等於0的行

答:awk -F ':' '$3==0' test.txt

4.用 ‘:’ 作為分隔符,查詢第一段為 ‘root’ 的行,並把該段的 ‘root’ 換成 ‘toor’ (可以連同sed一起使用)

答:awk -F ':' '$1=="root"' test.txt | sed 's/root/toor/'

5.用 ‘:’ 作為分隔符,列印最後一段

答:awk -F ':' '{print $NF}' test.txt

6.列印行數大於20的所有行

答:awk -F':' 'NR>20' test.txt

7.用 ‘:’ 作為分隔符,列印所有第三段小於第四段的行

答:awk -F':' '$3<$4' test.txt

8.用 ‘:’ 作為分隔符,列印第一段以及最後一段,並且中間用 ‘@’ 連線 (例如,第一行應該是這樣的形式 ‘ )

答:awk -F ':' '{OFS="@"} {print $1,$NF}' test.txt

9.用 ‘:’ 作為分隔符,把整個文件的第四段相加,求和

答:awk -F ':' '{tot=tot+$4}; END {print tot}' test.txt

相關推薦

linux表示式awk講解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux 表示式之grep

正則表示式就是處理字串的方法,可以執行查詢,刪除,替換等特定字元處理程式。 常用命令 grep ,awk ,sed [: alunm:] 代表英文大小寫字元及數字 即0-9 A-Z a-z [: alpha:] 代表任何英文大小寫字元 A-Z

linux 表示式 之 sed 與awk

sed 可以將資料進行替換,刪除,新增,選取等操作 sed [引數] [動作] 引數: -n :使用安靜模式 ,只有經過sed特殊處理的那一行才能被列出來 -i : 直接修改讀取檔案內容,而不是由螢幕輸出 -e

GNU/Linux 表示式與三劍俠(grep,sed,awk)(精)

相關好文章推薦: GNU 的正則表示式 傳聞中三劍俠的威名響徹雲霄,傳說中若沒有正則表示式的神功,三劍俠也是芸芸眾生,江湖中傳言"欲成劍俠,先練神功",不管傳說或傳聞我都信。 度度果然不是蓋的,一下就拔出了正則的歷史,不看不知道,一看就大有來頭,大約就是國外幾位猛人科學家在搞一個偉大的工程時誕

Linux表示式引擎(BRE ERE)支援的一些表達形式(Part.I BRE)

BRE(basic regular expression):以sed為例 純文字 :echo "Happy New Year" | sed -n '/Happy/p' 錨字元 : 匹配在行首 :echo "Happy New Year" | sed -n '/^

教你3分鐘搞定Linux表示式

導讀 正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元。 元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析; 正則表示式元字元,由vi/grep/sed/awk等文字處理工具進行解析; 正則表示式一般以文字行進行處理,在進

linux 表示式工具

2006-09-02 1.grep & egrep [[email protected] ~]$ vi test1 line 1 hello, I'm line 2 line 3 this is line

[Linux]表示式和grep使用

原創文章,歡迎轉載。轉載請註明:轉載自 祥的部落格 原文連結:https://blog.csdn.net/humanking7/article/details/84845641 文章目錄 @[toc] 1.

Linux--表示式--詳解

原文地址: https://www.cnblogs.com/hfutwyy/p/3415577.html 轉載請註明原文出處 一.linux文字查詢命令 在說linux正規表示式之前,還介紹下linux中查詢文字檔案常用的三個命令: 1.grep : 最早的文字

Linux-表示式-反選練習

練習文字如下,儲存為test.txt Archive: drgeo-oneclick.zip Length Method Size Ratio Date Time CRC-32 Name -------- ------ -------

Linux表示式-元字元

我們已經看過了表示式中的兩個基本元素: 1.以一個字面值或變量表示的值。 2. 一個操作符。 正則表示式是由這些相同的元素組成的。除元字元除外,都被解釋為只匹配它本身的字面值。元字元彙總 特殊字元 用途 . 匹配除換行符以外的任意單個字元。在awk 中,句點也能匹

Linux表示式基礎

轉載自實驗樓 實驗介紹 雖然我們這一節的標題是正則表示式,但實際這一節實驗只是介紹grep,sed,awk這三個命令,而正則表示式作為這三個命令的一種使用方式(命令輸出中可以包含正則表示式)。正則表示式本身的內容很多,要把它說明清楚需要單獨一門課程來實現,不過我們這一節中涉

Linux 表示式 vi, grep, sed, awk

1. vi 表示內容的元字元 模式 含義 . 匹配任意字元 [abc] 匹配方括號中的任意一個字元。可以使用-表示字元範圍,如[a-z0-9]匹配小寫字母和阿拉伯數字。 [^abc] 在方括號內開頭使用^符號,表示匹配除方括號中字元之外的任意

linux表示式語法

grep查詢字元時以整行為單位 查詢包含eth的內容 dmesg |grep 'eth' [ 1.857820] e1000 0000:02:01.0 eth0: (PCI:6

Linux表示式-選擇性操作與分組操作

選擇性操作 豎線(|)字元是元字元擴充套件集的一部分,用於指定正則表示式的聯合。如果某行匹配其中的一個正則表示式,那麼它就匹配該模式。例如,正則表示式:UNIX|LINUX 將匹配包含字串"UNIX" 或字串"LINUX" 的行。可以指定更多的選擇,例如: UNIX|LI

linux表示式的運用

說 明:正則表示式通常用於兩種任務:1.驗證,2.搜尋/替換。用於驗證時,通常需要在前後分別加上^和$,以匹配整個待驗證字串;搜尋/替換時是否加上 此限定則根據搜尋的要求而定,此外,也有可能要在前後加上\b而不是^和$。此表所列的常用正則表示式,除個別外均未在前後加上任

linux表示式

1. 正則介紹_grep 什麼是正則  (1)正則就是一串有規律的字串,其中包括特殊字元。  (2)掌握好正則對於編寫shell指令碼有很大的幫助。  (3)各種程式語言中都有正則,原理是一樣的  (4)本章學習grep/egrep 、sed、awk.(熟練掌握)

3分鐘搞定Linux系統表示式

正則表示式是一種字元模式,用於在查詢過程中匹配製定的字元。   元字元通常在Linux中分為兩類:Shell元字元,由Linux Shell進行解析; 正則表示式元字元,由vi/grep/sed/awk等文字處理工具進行解析; 正則表示式一

[一天幾個linux命令] shell指令碼之表示式

shell指令碼之正則表示式 原文連結:Linux–shell指令碼之正則表示式 概念及特點 概念 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定的字元、及這些特定字元的組合,組成一個"規則字串",這個"規則字串"用來表達對字串的一種過濾邏輯。規定一些特殊語

Linux下POSIX表示式API使用

一、概述 在Linux環境中,經常使用正則表示式,如grep、sed、find等等,目前正則表示式有2中不同的標準,分別是Perl標準和POSIX標準,這2種風格,大體相同,稍有差別。在 C/C++的標準庫均不支援表示式,不過在C++11標準中,貌似引入了boost的正則庫,在Li