目標
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
中的所有o
。o{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