正則表達式基礎
sed中關於pattern space和hold space的小實例一則
http://www.cnblogs.com/aidysun/archive/2013/02/21/2921293.html
正則表達式
正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
基本語法
一個正則表達式通常被稱爲一個模式(pattern),爲用來描述或者匹配一系列符合某個句法規則的字符串.
- 語法(部分)
優先級
grep模式匹配命令
基本操作
grep命令用於打印輸出文本中匹配的模式串,它使用正則表達式作爲模式匹配的條件。grep支持三種正則表達式引擎,分別用三個參數指定:
參數說明
-E POSIX擴展正則表達式,ERE
-G POSIX基本正則表達式,BRE
-P Perl正則表達式,PCRE
常用參數使用正則表達式
- 位置:查找/etc/group文件中以”shiyanlou”爲開頭的行
grep ‘shiyanlou’ /etc/group
grep ‘^shiyanlou’ /etc/group - 數量:將匹配以’z’開頭以’o’結尾的所有字符串
$ echo ‘zero\nzo\nzoo’ | grep ‘z.*o’ - 數量:將匹配以’z’開頭以’o’結尾,中間包含一個任意字符的字符串
echo ‘zero\nzo\nzoo’ | grep ‘z.o’ - 數量:將匹配以’z’開頭,以任意多個’o’結尾的字符串
echo ‘zero\nzo\nzoo’ | grep ‘zo*’ - 選擇:grep默認是區分大小寫的,這裏將匹配所有的小寫字母
echo ‘1234\nabcd’ | grep ‘[a-z]’ - 選擇:將匹配所有的數字
echo ‘1234\nabcd’ | grep ‘[0-9]’ - 選擇:將匹配所有的數字
echo ‘1234\nabcd’ | grep ‘[[:digit:]]’ - 選擇:將匹配所有的小寫字母
echo ‘1234\nabcd’ | grep ‘[[:lower:]]’ - 選擇:將匹配所有的大寫字母
echo ‘1234\nabcd’ | grep ‘[[:upper:]]’ - 選擇: 將匹配所有的字母和數字,包括0-9,a-z,A-Z
echo ‘1234\nabcd’ | grep ‘[[:alnum:]]’ 選擇:將匹配所有的字母
echo ‘1234\nabcd’ | grep ‘[[:alpha:]]’
完整的特殊符號及說明排除字符
echo ‘geek|good’ | grep ‘[^o]’
注意:當^放到中括號內爲排除字符,否則表示行首。
- 位置:查找/etc/group文件中以”shiyanlou”爲開頭的行
sed 流編輯器
sed工具在 man 手冊裏面的全名爲"sed - stream editor for filtering and transforming text ",意即,用於過濾和轉換文本的流編輯器。在 Linux/UNIX 的世界裏敢稱爲編輯器的工具,大都非等閒之輩,比如前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個編輯器。sed與上述的最大不同之處大於它是一個非交互式的編輯器,下面我們就開始介紹sed這個編輯器.
sed 命令基本格式
sed [參數]… [執行命令] [輸入文件]…
形如:
sed -i ‘1s/sad/happy/’ test # 表示將test文件中第一行的”sad”替換爲”happy”sed編輯器的執行命令(這裏”執行“解釋爲名詞)
[n1][,n2]command
[n1][~step]command
其中一些命令可以在後面加上作用範圍,形如:
sed -i ‘s/sad/happy/g’ test # g表示全局範圍
sed -i ‘s/sad/happy/4’ test # 4表示指定行中的第四個匹配字符串
其中n1,n2表示輸入內容的行號,它們之間爲,逗號則表示從n1到n2行,如果爲~波浪號則表示從n1開始以step爲步進的所有行;command爲執行動作。常用動作指令:
sed操作舉例
- 我們先找一個用於練習的文本文件:
cp /etc/passwd ~ - 打印指定行
- 打印2-5行
nl passwd | sed -n ‘2,5p’ - 打印奇數行
nl passwd | sed -n ‘1~2p’ - 行內替換
- 將輸入文本中”shiyanlou” 全局替換爲”hehe”,並只打印替換的那一行,注意這裏不能省略最後的”p”命令
sed -n ‘s/shiyanlou/hehe/gp’ passwd
注意: 行內替換可以結合正則表達式使用。 - 行間替換
nl passwd | grep “shiyanlou” - 刪除第21行
sed -n ‘21c\www.shiyanlou.com’ passwd
- 我們先找一個用於練習的文本文件:
awk文本處理語言
AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。它允許您創建簡短的程序,這些程序讀取輸入文件、爲數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。最簡單地說,AWK是一種用於處理文本的編程語言工具。
awk的一些基礎概念
awk所有的操作都是基於pattern(模式)—action(動作)對來完成的,如下面的形式:
pattern {action}你可以看到就如同很多編程語言一樣,它將所有的動作操作用一對{}花括號包圍起來。其中pattern通常是是表示用於匹配輸入的文本的“關係式”或“正則表達式”,action則是表示匹配後將執行的動作。在一個完整awk操作中,這兩者可以只有其中一個,如果沒有pattern則默認匹配輸入的全部文本,如果沒有action則默認爲打印匹配內容到屏幕。awk處理文本的方式,是將文本分割成一些“字段”,然後再對這些字段進行處理,默認情況下,awk以空格作爲一個字段的分割符,不過這不是固定了,你可以任意指定分隔符,下面將告訴你如何做到這一點。
- awk命令基本格式
awk [-F fs] [-v var=value] [-f prog-file | ‘program text’] [file…]
- -F:用於預先指定前面提到的字段分隔符(還有其他指定字段的方式)
- -v用於預先爲awk程序指定變量
- -f用於指定awk命令要執行的程序文件,或者在不加-f參數的情況下直 接將程序語句放在這裏
- 最後爲awk需要處理的文本輸入,且可以同時輸入多個文本文件
- awk操作
- 先用vim新建一個文本文檔
vim test
包含如下內容:
I like linux
www.shiyanlou.com - 使用awk將文本內容打印到終端
- 先用vim新建一個文本文檔
"quote>" 不用輸入**
awk '{
print
}' test
- 或者寫到一行
awk '{print}' test
- 將test的第一行的每個字段單獨顯示爲一行
> if(NR==1){
> print $1 "\n" $2 "\n" $3**
> } else {
> print}
> }' test
- 或者
awk '{
> if(NR==1){
> OFS="\n"
> print $1, $2, $3
> } else {
> print}
> }' test
說明:你首先應該注意的是,這裏我使用了awk語言的分支選擇語句if,它的使用和很多高級語言如C/C++語言基本一致,如果你有這些語言的基礎,這裏將很好理解。另一個你需要注意的是NR與OFS,這兩個是awk內建的變量,NR表示當前讀入的記錄數,你可以簡單的理解爲當前處理的行數,OFS表示輸出時的字段分隔符,默認爲" "空格,如上圖所見,我們將字段分隔符設置爲\n換行符,所以第一行原本以空格爲字段分隔的內容就分別輸出到單獨一行了。然後是$N其中N爲相應的字段號,這也是awk的內建變量,它表示引用相應的字段,因爲我們這裏第一行只有三個字段,所以只引用到了$3。除此之外另一個這裏沒有出現的$0,它表示引用當前記錄(當前行)的全部內容。
awk常用的內置變量