輕鬆學習之Linux教程六 Regex詳解,linuxRegex

來源:互聯網
上載者:User

輕鬆學習之Linux教程六 Regex詳解,linuxRegex

本系列文章由@超人愛因斯坦出品,轉載請註明出處。  

        作者:超人愛因斯坦    個人網站:http://www.hpw123.net 

         文章連結:http://hpw123.net/a/Linux/Linuxjichu/2014/1101/104.html

    郵箱: 424346976@qq.com

         CSDNhttp://blog.csdn.net/u010283694


Regex是一些特殊字元的排列,用以尋找、替換、刪除一些或多行文字字串,簡單的說,Regex就是用在字串的處理上面的一項“運算式”使用它真的很方便,所以好好學習吧,真的很有用呢。


好了,讓我們進入主題吧:


一.Regex


1.什麼是Regex

Regex基本上是一種“標記法”,只要工具程式支援這種標記法,那麼該工具程式就可以用來作為Regex的字串處理之用。例如vi,grep,,awk,sed等工具,因為它們有支援Regex


2.語系對Regex的影響

使用Regex時,需要特別留意當時環境的語係為何,否則可能會發現與別人不相同的選取結果

由於一般我們在練習Regex時,使用的是相容POSIX的標準,因此就使用“C”這個語系,另外,為了要避免這樣編碼所造成的英文與數位選取問題,因此有些特殊的符號我們需要瞭解,如下



3.基礎Regex字元(characters)



4.grep,sed使用

文法:


[root@www ~]# grep [-A] [-B] [--color=auto] '搜尋字串' filename 選項參數: -A :後面可加數字,為 after 的意思,除了列出該行外,後續的 n 行也列出來; -B :後面可加數字,為 befer 的意思,除了列出該行外,前面的 n 行也列出來; --color=auto 可將正確的那個選取資料列出顏色
[root@www ~]# sed [-nefr] [勱作] 選項參數: -n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過 sed 特殊處理的那一行(或者動作)才會被列出來。 -e :直接在指令列模式上進行 sed 的動作編輯; -f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的 sed 勱作; -r :sed 的動作支援的是擴充型Regex的文法。(預設是基礎Regex文法) -i :直接修改讀取的檔案內容,而不是由螢幕輸出。 動作說明: [n1[,n2]]function n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』 function 有底下這些咚咚: a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~ c :替換, c 癿後面可以接字串,這些字串可以替換 n1,n2 之間的行! d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚; i :插入, i 癿後面可以接字串,而這些字串會在新的一行出現(目前的上一行); p :列印,也就是將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~ s :替換,可以直接進行替換的工作哩!通常這個 s 的動作可以搭配Regex!例如 1,20s/old/new/g 就是啦!


案例:

步驟一:先觀察原始資訊,利用 /sbin/ifconfig 查詢 IP 為何? [root@www ~]# /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略).....步驟二:利用關鍵詞配合 grep 選取出關鍵的一行資料 [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 當場僅剩下一行!接下l來,我們要將開始到 addr: 通通刪除,就是像底下這樣: # inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 上面的刪除關鍵在於『 ^.*inet addr: 』啦!Regex出現! ^_^ 步驟三:將 IP 前面的部分予以刪除 [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 仔細與上個步驟比較一下,前面的部分不見了!接下來則是刪除後續的部分,即: # 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 # 此時所需的Regex為:『 Bcast.*$ 』就是啦! 步驟四:將 IP 後面的部分予以刪除 [root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100#另一個例子利用 sed 將 regular_express.txt 內每一行結尾若為 . 則換成 ! [root@www ~]# sed -i 's/\.$/\!/g' regular_express.txt # 上頭的 -i 選項可以讓你的 sed 直接去修改後面接的檔案內容而不是由螢幕輸出喔! 


5.擴充Regex



二.檔案的格式化及相關處理

1.格式化列印:printf

文法:


[root@www ~]# printf '列印格式' 實際內容 選項參數: 關於格式方面的幾個特殊樣式: \a 警告聲音輸出 \b 退格鍵(backspace) \f 清除螢幕 (form feed) \n 輸出新的一行 \r 即 Enter 按鍵 \t 水平的 [tab] 按鍵 \v 垂直的 [tab] 按鍵 \xNN NN 為兩位元的數字,可以轉換數字成為字元。 關於 C 程式語言內,常見的變數格式 %ns 那個 n 是數字, s 代表 string ,即多少個字元; %ni 那個 n 是數字, i 代表 integer ,即多少整數字數; %N.nf 那個 n 與 N 都是數字, f 代表 floating (浮點),如果有小數字數, 假如我共要十個位元,但小數點有兩位,即為 %10.2f 囉!
案列:


將 (printf.txt) 內容僅列出姓名與成績:(用 [tab] 分隔) [root@www ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt) Name Chinese English Math Average DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33
2.awk:好用的資料處理工具

awk也是一個非常棒的資料處理工具,相比於sed常常作用於一整行的處理,awk則比較傾向於將一行分成數個“欄位"來處理,因此,awk相當適合處理小型的資料資料處理呢,awk通常的啟動並執行模式是這樣的


[root@www ~]# awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
awk內建變數


案例:


[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}' root lines: 1 columes: 10root lines: 2 columes: 10 root lines: 3 columes: 10 dmtsai lines: 4 columes: 10 root lines: 5 columes: 9 # 注意喔,在 awk 內的 NR, NF 等變數要用大寫,且不需要有 $ 啦!
awk的邏輯運算子(用於條件判斷




                                                                     ——————————超人愛因斯坦於2014年11月01日更新



ok,今天的內容大概就是這些,如果有什麼寫的不對的,求大神指正,我們下篇文章見:)

呵呵,讓我們輕鬆一下吧    正能量

更多文章盡在:www.hpw123.net




怎學好Linux中的Regex?本人正在摸索中,不是很順利,望大哥們提些建議?

朋友 你好
Regex廣泛出現在UNIX/Linux相關的各種領域和多種程式設計語言裡。從常見的shell命令到大名鼎鼎的Perl語言再到當前非常流行的PHP,它都扮演著一個重要的角色。甚至windows的命令列控制台也支援Regex。如果你是一個Linux伺服器管理員,你經常會在一些伺服器的設定指令碼裡看到它。

  可以說,它是學好Linux/UNIX必需掌握的一個知識點,否則你連Linux的啟動指令碼都讀不懂。偏偏它又的確有點晦澀難懂,而且相關的資料又大部分是英文,更為它的學習增加了幾多困難。即使有些中文的翻譯資料,不同的譯者對一些術語的譯法也五花八門,讀著讓人平添困惑。為此,我決定為它寫一個簡明教程,盡量可以覆蓋Regex涉及到的各主要概念。

  我並不想把本文寫成一本詳細的Regex文法手冊,事實上,這些手冊已經存在了,不過讀起來比較難懂。我希望的是在完成本教程後,你可以比較輕鬆的讀懂各種工具的Regex文法手冊並可以迅速上手,不過要用好Regex,可不是一篇短短的教程可以解決的,那是無數實踐練習的結果。但是,本文的最後一部分對於Regex的編寫提出了一些原則性的建議,學習一下這些Regex應用先驅者的經驗會讓我們在今後的實踐中少走一些彎路。

  Regex是英文“regular expressions”的譯文,它的產生據說可以追溯到“神經網路”等比較高深的理論。那麼什麼是Regex呢?

  Regex是從左向右去匹配目標字串的一組模式。大多數字元在模式中表示它們自身並匹配目標中相應的字元。舉個最簡單的例子,模式“The quick brown fox”匹配了目標字串中與其完全相同的一部分。

  前面已經提過,Regex被許多植根於UNIX/Linux的工具採用,可是這些工具的Regex文法並不完全相同,它們中的一些對Regex文法的擴充並不被其它工具識別,這也為Regex的使用增加了難度。因此,當你在一個具體的環境中使用Regex時,你還要先看一下目標環境支援的文法範圍,以確保你的Regex被正確的解析。

希望能對你有點協助,祝你好運~
 
怎學好Linux中的Regex?本人正在摸索中,不是很順利,望大哥們提些建議?

樓上的在幹嘛?又是copy and paste?不好好的解決問題。

學正則沒有什麼捷徑可走。要不就簡單的瞭解下,要用的時候就到網上搜個改改就用。要不就安下心來把正則研究個透,自己掌握住正則。
真正的研究好正則,其實沒別的路,去看《精通Regex》,別的書都是白搭,這書是正則界的聖經,別被書的厚度嚇倒,做為一個過來人,可以很負責任的告訴你,在你走通正則的那一天,你會發現,你的努力是非常非常值得的。走不通的話,呵,我沒話可說。。。

正則真正的核心在於解析的原理和回朔的效率
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.