linux正則表達式匹配
1. linux find 正則表達式
1:
find 0?
0?代表的是要查找的路徑, 意思是在0?這個路徑下查找. bash的?匹配任意一個字元,這里0?匹配到了01和0s. 在01和0s下查找文件,返回了01 0s.
2:
find 0.
在0.下查找,bash里.就是字元'.' ,因為沒有0.這個文件, 所以報上面的錯誤.
3.
find ./ -regex "0."
在當前目錄查找匹配正則0.的文件, -regex的正則"0." 使用的是emacs的正則, 匹配0後面跟一個字元. 錯誤是在於-regex的正則表達式必須匹配整個路徑, 文件名前的路徑"./"也需要匹配. 可以這樣寫
find ./ -regex "./0."
2. Linux正則表達式
一.linux文本查找命令
在說linux正規表達式之前,還介紹下linux中查找文本文件常用的三個命令:
1.grep : 最早的文本匹配程序,使用POSIX定義的基本正則表達式(BRE)來匹配文本。
2.egrep : 擴展式grep,其使用擴展式正規表達式(ERE)來匹配文本。
3.fgrep : 快速grep,這個版本匹配固定字元串而非正則表達式。並且是唯一可以並行匹配多個字元串的版本。
如下簡單的介紹grep命令:
語法格式:
grep [options ...] pattern-spec [files ...]
用途:
匹配一個或多個模式的文本行。
options:
-E : 使用擴展正則表達式進行匹配, grep -E 或取代 egrep 命令。
-F : 使用固定字元串進行匹配, grep -F 或取代傳統的fgrep命令。
-e : 通常第一個非選項的參數認為是要匹配的模式,也可以同時提供多個模式,只要將其放入單引號,並用換行字元分隔他們。
模式以減號開頭時,為防止混淆其為選項,-e選項說明其後的參數為模式,即使他以減號開頭。
-f : 從pat-file文件讀取模式作為匹配。
-i : 模式匹配時忽略大小寫差異。
-l : 列出匹配模式的文件名稱,而不是列印匹配的行。
-q : 靜默的,如果匹配成功,不將匹配的行輸出到標准輸出;否則即是不成功。
-s : 不顯示錯誤信息,通常與-q並用。
-v : 顯示不匹配模式的行。
說明:可以同時查找多個文件中的內容,當指定多個文件時,每個顯示出的文件行前會有文件名加一個冒號標識其來自哪個文件。
可以使用多個-e 或 -f 選項,建立要查找的模式列表。
二.正則表達式簡要介紹
1.正則表達式的組成
(1).一般字元:沒有特殊意義的字元
(2).特殊字元(meta字元):元字元,有在正則表達式中有特殊意義
2.如下講下正則表達式中的常見meta字元
(1).POSIX BRE與ERE中都有的meta字元:
\ : 通常用於打開或關閉後續字元的特殊含義,如\(...\)與\{...\}
. : 匹配任何單個字元(除NUL)
* : 匹配其前的任何數目或沒有的單個字元,例: . 表示任一字元, 則 .* 匹配任一字元的任意長度
^ : 匹配緊接著的正則表達式,BRE中僅在正則表達式的開頭有特殊的含義,ERE中在任何位置都有特殊含義
$ : 匹配前面的正則表達式,在字元串或者行結尾處。BRE中僅在正則表達式的結尾處有特殊的含義,ERE中在任何位置都有特殊含義
[] : 匹配方括弧內的任一字元,其中可用連字元(-)指的連續字元的范圍;^符號苦出現在方括弧的第一個位置,則表示匹配不在列表中的任一字元,
(2).POSIX BRE中才有的字元:
\{n,m\} : 區間表達式,匹配在它前面的單個字元重現的次數區別。\{n\}指重現n次;\{n,m\}指重現n至m次;
\( \) : 保留空間,可以將最多9個獨立的子模式存儲在單個模式中。如\(ab\).*\1 : 指匹配ab組合的兩次重現,中間可存在任意數目的字元。
\n : 重復在\(與\)方括弧內第n個子模式至此點的模式。
(3).POSIX ERE中才有的字元:
{n,m} : 與BRE的\{n,m\}功能相同
+ : 匹配前面正則表達式的一個或多個擴展
? : 匹配前面正則表達式的零個或一個擴展
| : 匹配|符號前或後的正則表達式
( ) : 匹配方括弧括起來的正則表達式群
(4). 方括弧([])表達式
4.1.字元集 [: :]
標識字元集,有如下幾種:
[::alnum] : 數字字元[:digit:] : 數字字元[:punct:] : 標點符號字元
[:alpha:] : 字母字元[:graph:] : 非空格字元[:space:] : 空格字元
[:blank:] : 空格與定位字元[:lower:] : 小寫字母字元[:upper:] : 大寫字母字元
[:cntrl:] : 控制字元[:print:] : 可顯示的字元[:xdigit:] : 16進制數字
4.2.排序符號
指將多個字元視為一個符號,如[.ch.]即將ch視為一個符號
4.3.等價字元
認為多個字元相等,如[=e=]在法文的locale里,可匹配於多種與e相似的字元,此處不再列出。
說明:這三種構造除其自身的方括弧之外,還必須使用額外的方括弧括起來。
例 : [[:alpha:]!] : 匹配任一英文字母或感嘆號。
[[.ch.] : 匹配ch排序元素,而不匹配單獨的字母c或h.
3.簡單正規表達式匹配案例
china : 匹配此行中任意位置有china字元的行
^china : 匹配此以china開關的行
china$ : 匹配以china結尾的行
^china$ : 匹配僅有china五個字元的行
[Cc]hina : 匹配含有China或china的行
Ch.na : 匹配包含Ch兩字母並且其後緊跟一個任意字元之後又有na兩個字元的行
Ch.*na : 匹配一行中含Ch字元,並且其後跟0個或者多個字元,再繼續跟na兩字元
二.實例
如下通過常用實例來學習BRE和ERE匹配,源文件url.txt內容如下:
www..com
http://www..com
https://www..com
http://wwwcom
.com
1.url匹配
匹配以http或者https開頭,並且其後為:並且含有.的串
BRE匹配:
grep '^https\{0,1\}.*\..*' url.txt
ERE匹配:
grep -E '^https?.*\..*' url.txt
匹配結果如下:
http://www..com
https://www..com
2.Email匹配
示例文件內容為:
[email protected]
aaaa@
[email protected]
[email protected]
@@.com
匹配以字母數字或者下劃線開頭的多個字元,其後有一個@之後有多個字母數字或者下劃線,其中有一個.號
grep '^[[:alpha:][:digit:]_]*@[[:alpha:][:digit:]]*\..*' email.txt
匹配結果:
[email protected]
[email protected]
[email protected]
轉自 嘉為教育-rhce認證_rhce培訓_linux培訓_linux認證_linux考證
3. Linux正則表達式與通配符
正則表達式:在計算機科學中,是指一個用來描述或者匹配一系列符合某個句法規則的字元串的單個字元串。在很多文本編輯器或其他工具里,正則表達式通常被用來檢索或替換那些符合某個模式的文本內容。正則表達式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。
只有掌握了正則表達式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法
grep、sed、awk天然支持正則
grep -v代表反選,反向選擇匹配到的內容
grep -E代表使用擴展正則
grep -P代表使用Perl正則
sed -r 代表使用擴展正則
正則表達式分為三類(man grep可以看到,分別是basic RegExs,extended RegExs,perl RegExs)
1、基本的正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)
2、擴展的正則表達式(Extended Regular Expression 又叫 Extended RegEx 簡稱 EREs)
3、Perl 的正則表達式(Perl Regular Expression 又叫 Perl RegEx 簡稱 PREs)
b. 處理過程:查找文本文件中是否包含要查找的 「關鍵字」(關鍵字可以是正則表達式) ,默認返回匹配的該行的內容
c. grep|egrep處理文件時,按行處理 |
| sed | sed | sed -r | - | a. 處理對象:文本文件
b.處理操作:對文本文件的內容進行 查找、替換、刪除、增加等操作
c. sed 在處理文本文件的時候,按行處理 |
| awk | - | awk | - | a. awk 處理的對象:文本文件
b. awk 處理操作:主要是對列進行操作 |
注意:egrep 或 sed -r 默認使用擴展正則表達式(EREs),一般特殊字元({})可以不轉義
grep -E 以及egrep(Extend Regular Expression)
Linux通配符和三劍客的正則表達式是不一樣的,因此,代表的意義也有較大的區別 。
通配符一般用戶命令行bash環境,而linux正則表達式用於grep, sed, awk場景。
通配符說明
示例:* 的使用:代表任意0-N個字元,代表所有字元
4. Linux系統下如何使用AWK正則表達式
awk 正則有幾種使用方法
直接當做條件 awk '/正則/{執行語句}' file 表示只對能夠匹配正則的行執行後面的語句, !/正則/ 則是不匹配時執行
對某個列進行判斷 awk '$1 ~ /正則/{執行語句}' file 表示第一列如果匹配正則,對該行進行處理。也可以用 ~! 或 !~ 表示不匹配時進行處理。 第一種情況相當於 $0 ~ /正則/
分隔符使用正則, 在awk的-F參數後可以直接使用正則表達式 表示能夠匹配的都當做分隔符;awk中設置 其他分隔符 如FS、RS等也可以使用正則
字元串函數中使用正則。 如split(s,a,fs) 在fs上將s分成序列a,其中fs就可以用正則;幾個替換函數gensub(a,b,c[,d])等也可以包含正則表達式,例如:
gensub(/123/,"x",1,$1)替換$1中 第一次匹配到的123為字元x,返回值為$1替換後的內容,且$1的內容並沒有改變
等等
5. linux 中 ^[^abc] 正則表達式什麼意思
^代錶行首,$代錶行尾
1、^[a-z]匹配以小寫字母開頭的字元串
2、[^a-z] 不包含小寫字母的字元匹配
3、^[^a-z] 開頭不包含小寫字母的字元匹配
6. Linux如何使用正則表達式命令文本文件操作命令
Linux對文本操作命令及正則表達式:
cat
cat 是 concatenate 的縮寫,所以它的作用其實是連接文件。但默認情況下它會將連接文件的結果送到標准輸出。所以我們常用來顯示文件內容。類似於 dos 中的 type。
more
當一個文件的內容超過一屏後,我們可以用 more 這個指令來逐屏 察看 文件內容。
less
less 在 more 的基礎上,更可以逐行 察看 ,前後翻頁。
head
head 顯示文件開頭部分內容,默認顯示前十行參數 --lines 或者 –n 指明顯示行數基本格式:
tail
tail 顯示文件結尾部分內容,命令用法同 head,參數 -f 顯示文件的紀實更新,用於監視日誌文件
tail 默認顯示文件列表中每個文件的後 10 行,如果沒有文件名或文件名為「-」則其從標准輸入中讀取文件,如果有多個文件則其會在文件前面加上「==>文件名<==」以便區別。
# tail /etc/mail/sendmail.mc 默認查看文件的後 10 行內容
# tail –n 20 /etc/passwd 查看文件後 20 行內容
注意: # tail –f /var/log/message 實時監控日誌文件更新信息,非常重要
diff
diff 用於比較兩個文件之間的區別,並送到標准輸出。輸出時先報告兩個文件的哪一行不同。基本格式:
參數:
uniq 用於去除文本中相鄰的重復行。
-u 參數可以只顯示那些沒有被重復過的行。 -d 顯示有被重復過的行。
cut
cut 可以根據一個指定的標記(默認是 tab)來為文本劃分列,然後將此列顯示。使用許可權:所有使用者
基本格式: cut -cnum1 -num2 filename
說明:顯示每行從開頭算起 num1 到 num2 的文字。
[root@uplooking root] $ cut –f1 –d: /etc/shadow 表示以 : 為分隔符,顯示 /etc/shadow 的第一列 sort
sort 用來按各種需要重新排列文本,一般運用在一個管道之後。例如:
默認情況下 sort 按照字母順序排列文本。
wc
wc 用來統計一個文件的行數、詞數、字數並送到標准輸出。也可以用-l(行數)、-w(詞數)、-c(字數)來指定輸出內容。
7. linux中 正則表達式和通配符的區別
通配符
它是由shell解析,並且一般用於匹配文件名,實際上就是shell解釋器去解析的特殊符號,linux系統通配符有幾下幾種:
*:匹配任意多個字元
?:匹配任意一個字元
[...]:匹配中括弧內出現的任意一個字元
[!...]:不匹配中括弧內出現的任意一個字元
一般出現在要shell命令或腳本中,匹配特定的文件名
正則表達式
它是一個字元匹配標准,一些命令工具按此標准實現字元匹配,根據命令支持的匹配功能可分為基礎正則表達式和擴展正則表達式,常用於支持正則表達式的工具,如sed,grep,awk...
有如下一些常用的匹配元字元:
字元匹配
.:匹配任意單個字元
*:匹配其前面一個字元出現任意次
?:匹配其前面的字元1次或0次
+:匹配其前面一個字元出現至少一次(在擴展正則表達式中)
位置匹配
^:錨定行首
$:錨定行尾
\<或\b:錨定詞首,其後面的任意字元必須作為單詞首部出現
\>或\b:錨定詞尾,其前面的任意字元必須作為單詞尾部出現
\B:非單詞的開頭或結尾
^$:空白行
分組() :
(ab)* : 匹配ab這個分組出現任意次
\1:引用第一個左括弧以及與之對應的右括弧所包括的所有內容,同理還有\2,\3
特殊子字元類:
[:alnum:] :任何字母和數字
[:alpha:] :任何字母
[:cntrl:] :控制字元. 在ASCII表中對應八進制000 到 037, 和177 ('DEL').
[:digit:] :任何數字
[:graph:] :匹配列印字元,相當於'[:alnum:]' +'[:punct:]'.
[:lower:] :小寫字母
[:print:] :可列印字元,相當於 '[:alnum:]', '[:punct:]', 和space.
[:punct:] 標點符號,'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'
[:space:] 空白字元,tab, newline, vertical tab, form feed, carriage return, and space.
[:upper:] 大寫字母
[:xdigit:] 任何16進制的數字,相當於[0-9a-fA-F]
所以:^[[:space:]]*$ :匹配沒有任何內容的行
需要注意:[]中的特殊字元如.已經失去了其特殊含義,和方括弧中的普通字元[abc]一樣。
8. Linux Shell正則表達式如何匹配1~3位數字
grep '^[0-9]\{1,3\}$' test.txt | grep '^[1-9]'
如果是變數
echo $var | grep '^[0-9]\{1,3\}$' | grep '^[1-9]'
$表示行尾
這個正則不匹配 12a 這樣的字元串
你的變數內容是什麼樣的看
我用來測試的 test.txt 的內容:
123
321
123212
001
010
100
10000
0011
10101
1101
1
2
3
11
22
33
1a
2a
9. Linux Shell正則表達式如何匹配1~3位數字
grep '^[0-9]\{1,3\}$' test.txt | grep '^[1-9]'
如果是變數
echo $var | grep '^[0-9]\{1,3\}$' | grep '^[1-9]'
$表示行尾
這個正則不匹配 12a 這樣的字元串
你的變數內容是什麼樣的?
我用來測試的 test.txt 的內容:
123
321
123212
001
010
100
10000
0011
10101
1101
1
2
3
11
22
33
1a
2a
10. 4-19-1 Linux中的正則表達式 --- 匹配次數
1、匹配次數:指的是某一個字元出現了多少個。
2、常用參數:
3、實操練習
③、\ ? 匹配前面的字元 0 次或 1 次。
④、\ + 匹配前面的字元至少 1 次。
⑤、\ {n} 匹配前面的字元 n 次。(等於多少次)
⑥、\ {m,n\ } 匹配前面的字元至少 m 次,最多 n 次。(大於等於多少次,小於等於多少次)
⑦、\ {,n\ } 匹配前面的字元最多 n 次。(小於等於多少次)
⑧、\ {n,\ } 匹配前面的字元至少 n 次。(大於等於多少次)