Linux 正則表達式基礎(grep,sed,awk)

目標

1.掌握基本命令:sed ,grep ,awk的用法
2.掌握正則表達式符號和語法

學習目錄

1.什麼是正則表達式?
2.正則表達式的基本語法
3.grep命令
4.sed流編輯器
5.awk文本處理語言


1.什麼是正則表達式?

在編寫處理字符串的程序或網頁時,經常會有查找符合某些複雜規則的字符串的需要。正則表達式就是用於描述這些規則的工具。正則表達式就是記錄文本規則的代碼。
下面通過grep,sed和awk命令來實際演示正則表達式如何使用。
參考網址


2.正則表達式的基本語法

一個正則表達式通常被稱爲一個pattern,爲用來描述或者匹配一系列符合某個句法規則的字符串。

選擇

|:表示選擇。
實例: boy|girl可以匹配boy或girl。

限定數量

+:表示+號前面的字符必須出現至少一次或多次。
實例:"goo+gle"可以匹配出gooogle,goooogle

?;表示?前面的字符最多出現一次(0次或1次)。
實例:"colou?r"可以匹配color,colour

*:表示*前面的字符可以不出現也可以出現一次或多次。
實例:"0*42"可以匹配42,042,0042,00042

範圍和優先級

()圓括號可以用來定義模式字符串的範圍和優先級。

語法

\:將下一個字符標記爲一個特殊字符或一個原義字符。
^:匹配輸入字符串開始的位置。
$:匹配輸入字符串的結束位置。
{n}:n是一個非負整數匹配確定的n次。
實例:"o{2}"不能匹配Bob中的o,但是能匹配food中的兩個o
{n,}:n是一個非負整數,至少匹配n次。
實例:"o{2,}"不能匹配Bob中的o,但是能匹配fooooood中的所有oo{1,}等價於o+o{0,}等價於o*.
{n,m}:m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。
*:匹配前面的子表達式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價於{0,}
+:匹配前面的子表達式一次或多次。
?:匹配前面的子表達式零次或一次。
.:匹配除\n之外的任何單個字符。
(pattern):匹配pattern並獲取這一匹配的子字符串。
x|y:匹配x或y。
[xyz]:字符集合。匹配所包含的任一字符。
[^xyz]:排除型字符集合。匹配未列出的任意字符。
[a-z]:字符範圍。匹配指定範圍內的任意字符。
[^a-z]:排除型字符範圍。匹配任何不在指定範圍內的任意字符。
【思維導圖】


3.grep命令

grep命令用於打印輸出文本中匹配的模式串,它使用正則表達式作爲模式匹配的條件。

grep支持的三種正則表達式引擎

1.-E:POSIX擴展正則表達式 ERE
2.-G:POSIX基本正則表達式 BRE
3.-p:perl正則表達式 PCRE
grep命令參考網址

使用正則表達式BRE

實例:

位置:
grep '^a' /etc/passwd  #查找/etc/passwd文件中以a開頭的行

數量:
echo zero\nzo\nzoo | grep 'z.*o'   #匹配以z開頭以o結尾的所有字符串。
echo zero\nzo\nzoo | grep 'z.o'    #匹配以z開頭的以o結尾中間包含任一字符的字符串。
echo zero\nzo\nzoo | grep 'zo*'    #匹配以z開頭以任意多個o結尾的字符串

選擇:
nl /etc/passwd | grep '[a-z]'   #匹配/etc/passwd中所有的小寫字母
nl /etc/passwd | grep '[0-9]'   #匹配/etc/passwd所有數字
nl /etc/passwd | grep '[[:digit:]]'   #匹配/etc/passwd所有數字
nl /etc/passwd | grep '[[:lower:]]'   #匹配/etc/passwd所有小寫字母
nl /etc/passwd | grep '[[:upper:]]'   #匹配/etc/passwd所有大寫字母
nl /etc/passwd | grep '[[:alnum:]]'   #匹配/etc/passwd所有字母和數字
nl /etc/passwd | grep '[[:alpha:]]'   #匹配/etc/passwd所有字母

排除字符
echo 'geek\ngood' | grep '[^o]'    #當^放入[]代表排除字符,o不顯示

使用擴展正則表達式ERE

要通過grep使用擴展正則表達式需要加上-E參數,或使用egrep。
實例:

數量:
nl /etc/passwd | grep -E 'zo{1}'    #只匹配zo
echo 'zero\nzo\nzoo' | grep -E 'zo{1,}'    #匹配以zo開頭的所有單詞  

選擇:
echo 'www.baidu.com\nwww.google.com\nwww.bing.com' | grep -E 'www\.(google|bing)\.com'   
#匹配www.google.com和www.bing.com
echo 'www.baidu.com\nwww.google.com\nwww.bing.com' | grep -Ev 'www\.baidu\.com'
#匹配不包含www.baidu.com的內容
PS:.號有特殊含義,需要\轉義符來轉義

4.sed流編輯器

功能強大的流式文本編輯器。
sed 是一種流編輯器,它是文本處理中非常重要的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。

sed基本格式

sed [參數]... [執行命令][輸入文件]...
sed命令參考網址

sed動作指令

s:行內替換
c:整行替換
a:插到指定行的後面
i:插到指定行的前面
p:打印指定行,通常與-n參數配合使用
d:刪除指定行
實例:

打印指定行(p):
nl passwd(文件) | sed -n '2,5p'    #打印2-5行
nl passwd(文件) | sed -n '1~2p'    #打印奇數行

行內替換(s):
sed -n 's/zsh/hehe/gp' passwd(文件)
#將輸入文本中zsh全局替換爲hehe,並且只打印替換的那一行

刪除某行(d):
sed -i '30d' passwd(文件)    #刪除30

5.awk文本處理語言

文本和數據進行處理的編程語言。
awk 是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據可以來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作爲腳本來使用。awk有很多內建的功能,比如數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
操作基於pattern {action}完成。
實例:

準備:
vim test    #使用vim新建一個文本文檔
I like Linux 
www.github.com    #輸入以上內容

將文本內容打印到終端
1.
awk '{
print
}' test
2.
awk '{print}' test    #可以寫多行也可以寫一行

將test第一行的每個字段單獨顯示爲一行
awk '{
if(NR==1){
print $1 "\n" $2 "\n" $3 "\n"
} else {
print}
}' test    #NR是awk內建的變量,表示當前處理的行數。 $n中的n爲相應的字段號
或者
awk '{
if(NR==1){
OFS="\n"
print $1,$2,$3
} else {
print}
}' test    #OFS是awk內建的變量,表示輸出時的字段分隔符,默認爲空格。    

將test的第二行以點分佈的字段換成以空格爲分隔
awk -F'.' '{
if(NR==2){
print $1 "\t" $2 "\t" $3 "\t"    #print打印的非變量內容都需要用""包圍起來
}}' test    #-F用來預先指定待處理記錄的字段分隔符
或者
awk '
BEGIN{    #BEGIN這個表達式指示了其後的動作將在所有動作之前執行。
FS="."
OFS="\t"
}{
if(NR==2){
print $1,$2,$3
}}' test    

參考網址1
參考網址2

發佈了32 篇原創文章 · 獲贊 0 · 訪問量 887
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章