日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux-basic(12)正则表达式与文件格式化处理

發(fā)布時(shí)間:2023/12/3 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux-basic(12)正则表达式与文件格式化处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【12.1.1】什么是正則表達(dá)式?
1)簡(jiǎn)單說(shuō):正則表示法就是處理字串的方法,他是以行為單位來(lái)進(jìn)行字串的處理行為, 正則表達(dá)式透過(guò)一些特殊符號(hào)的輔助,可以讓使用者輕易的達(dá)到查找、刪除、替換某特定字串的處理程序!

【12.1.5】擴(kuò)展的正則表達(dá)式
正則表達(dá)式的字串表示方式依照不同的嚴(yán)謹(jǐn)度而分為: 基礎(chǔ)正則表達(dá)式與擴(kuò)展正則表達(dá)式。

【12.2】基礎(chǔ)正則表達(dá)式
【12.2.1】語(yǔ)系對(duì)正則表達(dá)式的影響

1) 舉例來(lái)說(shuō),在英文大小寫(xiě)的編碼順序中,zh_TW.big5 及 C 這兩種語(yǔ)系的輸出結(jié)果分別如下:
? ● LANG=C? ? ?時(shí):0 1 2 3 4 ... A B C D ... Z a b c d ...z
? ● LANG=zh_TW 時(shí):0 1 2 3 4 ... a A b B c C d D ... z Z
2)為了要避免這樣編碼所造成的英文與數(shù)字的擷取問(wèn)題,因此有些特殊的符號(hào)我們得要了解一下的! 這些符號(hào)主要有底下這些意義:

(1)
【12.2.2】grep的一些高級(jí)參數(shù)
(2)
【荔枝】
(3)
補(bǔ)充1:grep 是一個(gè)很常見(jiàn)也很常用的命令,他最重要的功能就是進(jìn)行字串?dāng)?shù)據(jù)的比對(duì),然后將符合使用者需求的字串列印出來(lái)。 需要說(shuō)明的是 grep 在數(shù)據(jù)中查尋一個(gè)字串時(shí),是以 "整行" 為單位來(lái)進(jìn)行數(shù)據(jù)的擷取的!
補(bǔ)充2:你可以在 ~/.bashrc 內(nèi)加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來(lái)立即生效即可喔! 這樣每次運(yùn)行 grep 他都會(huì)自動(dòng)幫你加上顏色顯示啦!
(4)
(5)
【12.2.3】基礎(chǔ)正則表達(dá)式練習(xí)
1)底下的練習(xí)大前提是:
? ● 語(yǔ)系已經(jīng)使用『 export LANG=C 』的配置值;
? ● grep 已經(jīng)使用 alias 配置成為『 grep --color=auto 』
2)regular_express.txt 內(nèi)容如下:?
"Open Source" is a good mechanism to develop programs. apple is my favorite food. Football game is not use feet only. this dress doesn't fit me. However, this dress is about $ 3183 dollars. GNU is free air not free beer. Her hair is very beauty. I can't finish the test. Oh! The soup taste good. motorcycle is cheap than car. This window is clear. the symbol '*' is represented as start. Oh! My god! The gd software is a library for drafting programs. You are the best is mean you are the no. 1. The world <Happy> is the same with "glad". I like dog. google is the best tools for search keyword. goooooogle yes! go! go! Let's go. # I am VBird【荔枝1】在文件中搜索the這個(gè)字符串所在的數(shù)據(jù)行;
(6)
【荔枝2】反向選擇;
(7)
(8)
【荔枝】 利用中括號(hào) [] 來(lái)搜索集合字節(jié)
(9)
(10)
(11)
【繼續(xù)荔枝】假設(shè)我 oo 前面不想要有小寫(xiě)字節(jié),所以,我可以這樣寫(xiě) [^abcd....z]oo , 但是這樣似乎不怎么方便,由於小寫(xiě)字節(jié)的 ASCII 上編碼的順序是連續(xù)的, 因此,我們可以將之簡(jiǎn)化為底下這樣:
(12)
(13)
(14)
(15)
【荔枝3】行首與行尾字符 ^$
(16)
(17)
(18)
(19)
【注意】^ 在中括號(hào)[] 外面表示行首,在中括號(hào)里面表示取反或非;
(20)
【注意】
注意1:上荔枝中 用 反斜杠 \ 對(duì) 點(diǎn)符號(hào). 進(jìn)行了轉(zhuǎn)義;
注意2:你或許會(huì)覺(jué)得奇怪,但是第 5~9 行最后面也是 . 啊~怎么無(wú)法列印出來(lái)? 這里就牽涉到 Windows 平臺(tái)的軟件對(duì)於斷行字節(jié)的判斷問(wèn)題了!我們使用 cat -A 將第五行拿出來(lái)看, 你會(huì)發(fā)現(xiàn):
(21)
在上面的表格中我們可以發(fā)現(xiàn) 5~9 行為 Windows 的斷行字節(jié) (^M$) ,而正常的 Linux 應(yīng)該僅有第 10 行顯示的那樣 ($) 。所以羅,那個(gè) . 自然就不是緊接在 $ 之前喔!也就捉不到 5~9 行了!
(22)
(23)
【荔枝4】任意一個(gè)字節(jié). 與重復(fù)字節(jié)*
這兩個(gè)符號(hào)在正規(guī)表示法的意義如下:
? ● . (小數(shù)點(diǎn)):代表『一定有一個(gè)任意字節(jié)』的意思;
? ● * (星星號(hào)):代表『重復(fù)前一個(gè)字節(jié), 0 到無(wú)窮多次』的意思,為組合形態(tài)
場(chǎng)景1)假設(shè)我需要找出 g??d 的字串,亦即共有四個(gè)字節(jié), 起頭是 g 而結(jié)束是 d ,我可以這樣做:
(24)
補(bǔ)充1)因?yàn)?* 代表的是『重復(fù) 0 個(gè)或多個(gè)前面的 RE 字符』的意義, 因此,『o*』代表的是:『擁有空字節(jié)或一個(gè) o 以上的字節(jié)』, 特別注意,因?yàn)樵试S空字節(jié)(就是有沒(méi)有字節(jié)都可以的意思),因此,『 grep -n 'o*' regular_express.txt 』將會(huì)把所有的數(shù)據(jù)都列印出來(lái)螢?zāi)簧?#xff01;
補(bǔ)充2)那如果是『oo*』呢?則第一個(gè) o 肯定必須要存在,第二個(gè) o 則是可有可無(wú)的多個(gè) o , 所以,凡是含有 o, oo, ooo, oooo 等等,都可以被列出來(lái)~
補(bǔ)充3)同理,當(dāng)我們需要『至少兩個(gè) o 以上的字串』時(shí),就需要 ooo* ,亦即是:
(25)
(26)
(27)
(28)
【荔枝5】限定連續(xù) 正則表達(dá)式 字符范圍 {}
在上個(gè)例題當(dāng)中,我們可以利用 . 與 RE 字符及 * 來(lái)配置 0 個(gè)到無(wú)限多個(gè)重復(fù)字節(jié), 那如果我想要限制一個(gè)范圍區(qū)間內(nèi)的重復(fù)字節(jié)數(shù)呢?舉例來(lái)說(shuō),我想要找出兩個(gè)到五個(gè) o 的連續(xù)字串,該如何作?這時(shí)候就得要使用到限定范圍的字符 {} 了。 但因?yàn)?{ 與 } 的符號(hào)在 shell 是有特殊意義的,因此, 我們必須要使用跳脫字符 \ 來(lái)讓他失去特殊意義才行。?

場(chǎng)景1)至於 {} 的語(yǔ)法是這樣的,假設(shè)我要找到兩個(gè) o 的字串,可以是:
(29)
(30)
(31)
【12.2.4】基礎(chǔ)正則表達(dá)式字符
1)基礎(chǔ)的正規(guī)表示法特殊字符匯整如下:
(32)
注意1:再次強(qiáng)調(diào):『正則表達(dá)式的特殊字節(jié)』與一般在命令列輸入命令的通配符并不相同, 例如,在通配符中的 * 代表的是『 0 ~ 無(wú)限多個(gè)字節(jié)』的意思,但是在正則表達(dá)式當(dāng)中, * 則是『重復(fù) 0 到無(wú)窮多個(gè)的前一個(gè) RE 字符』的意思。

【12.2.5】sed工具
1)sed 本身也是一個(gè)管線命令,可以分析 standard input 的啦! 而且 sed 還可以將數(shù)據(jù)進(jìn)行取代、刪除、新增、擷取特定行等等的功能呢!
(33)
2)以行為單位的新增/刪除功能
(34)
補(bǔ)充:如果題型變化一下,舉例來(lái)說(shuō),如果只要?jiǎng)h除第 2 行,可以使用『 nl /etc/passwd | sed '2d' 』來(lái)達(dá)成, 至於若是要?jiǎng)h除第 3 到最后一行,則是『 nl /etc/passwd | sed '3,$d' 』的啦,那個(gè)錢(qián)字號(hào)『 $ 』代表最后一行!
(35)
補(bǔ)充:在 a 后面加上的字串就已將出現(xiàn)在第二行后面羅!那如果是要在第二行前呢?『 nl /etc/passwd | sed '2i drink tea' 』就對(duì)啦!就是將『 a 』變成『 i 』即可。?

【繼續(xù)荔枝】:添加一行很簡(jiǎn)單,那如果是要增將兩行以上呢?
(36)
3)以行為單位的取代與顯示功能
(37)
(38)
(39)
4)部分?jǐn)?shù)據(jù)的搜尋并取代的功能
除了整行的處理模式之外, sed 還可以用行為單位進(jìn)行部分?jǐn)?shù)據(jù)的搜尋并取代的功能喔! 基本上 sed 的搜尋與取代的與 vi 相當(dāng)?shù)念愃?#xff01;他有點(diǎn)像這樣:sed 's/要被取代的字串/新的字串/g'

【荔枝】 文本內(nèi)容如下:
(40)
(41)
(42)
(43)
(44)
【繼續(xù)荔枝】假設(shè)我只要 MAN 存在的那幾行數(shù)據(jù), 但是含有 # 在內(nèi)的注解我不想要,而且空白行我也不要!此時(shí)該如何處理呢?可以透過(guò)這幾個(gè)步驟來(lái)實(shí)作看看:
(45)
(46)
(47)
空白行:包括有空格符的空白行,沒(méi)有空格符的空白行;

5)直接修改文件內(nèi)容(危險(xiǎn)操作): sed 甚至可以直接修改文件的內(nèi)容呢!而不必使用管線命令或數(shù)據(jù)流重導(dǎo)向! 不過(guò),由於這個(gè)動(dòng)作會(huì)直接修改到原始的文件,所以請(qǐng)你千萬(wàn)不要隨便拿系統(tǒng)配置檔來(lái)測(cè)試喔! 我們還是使用你下載的 regular_express.txt 文件來(lái)測(cè)試看看吧!
(48)
(49)
sed 的『 -i 』選項(xiàng)可以直接修改文件內(nèi)容,這功能非常有幫助!舉例來(lái)說(shuō),如果你有一個(gè) 100 萬(wàn)行的文件,你要在第 100 行加某些文字,此時(shí)使用 vim 可能會(huì)瘋掉!因?yàn)槲募罅?#xff01;那怎辦?就利用 sed 啊!透過(guò) sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!很棒吧!

【12.3】擴(kuò)展正則表達(dá)式
1)為什么需要擴(kuò)展正則表達(dá)式? 舉個(gè)簡(jiǎn)單的例子好了,在上節(jié)的例題三的最后一個(gè)例子中,我們要去除空白行與行首為 # 的行列,使用的是
grep -v '^$' regular_express.txt | grep -v '^#'
需要使用到管線命令來(lái)搜尋兩次!那么如果使用延伸型的正規(guī)表示法,我們可以簡(jiǎn)化為:
egrep -v '^$|^#' regular_express.txt

2)擴(kuò)展正則表達(dá)式可以透過(guò)群組功能『 | 』來(lái)進(jìn)行一次搜尋!那個(gè)在單引號(hào)內(nèi)的管線意義為『或 or』啦! 是否變的更簡(jiǎn)單呢?此外,grep 默認(rèn)僅支持基礎(chǔ)正規(guī)表示法,如果要使用延伸型正規(guī)表示法,你可以使用 grep -E , 不過(guò)更建議直接使用 egrep !直接區(qū)分命令比較好記憶!其實(shí) egrep 與 grep -E 是類似命令別名的關(guān)系啦!

3)擴(kuò)展型正則表達(dá)式有哪幾個(gè)特殊符號(hào)呢?
(50)
【荔枝】
(51)
(52)
(53)
(54)
(55)
【12.4】文件的格式化與相關(guān)處理
【12.4.1】格式化打印: printf

(56)
【荔枝】
(57)
補(bǔ)充: 在 printf 后續(xù)的那一段格式中,%s 代表一個(gè)不固定長(zhǎng)度的字串,而字串與字串中間就以 \t 這個(gè) [tab] 分隔符號(hào)來(lái)處理!你要記得的是,由於 \t 與 %s 中間還有空格,因此每個(gè)字串間會(huì)有一個(gè) [tab] 與一個(gè)空白鍵的分隔喔!
(58)
補(bǔ)充:上面的格式共分為五個(gè)欄位, %10s 代表的是一個(gè)長(zhǎng)度為 10 個(gè)字節(jié)的字串欄位,%5i 代表的是長(zhǎng)度為 5 個(gè)字節(jié)的數(shù)字欄位,至於那個(gè) %8.2f 則代表長(zhǎng)度為 8 個(gè)字節(jié)的具有小數(shù)點(diǎn)的欄位,其中小數(shù)點(diǎn)有兩個(gè)字節(jié)寬度。我們可以使用底下的說(shuō)明來(lái)介紹 %8.2f 的意義:
字節(jié)寬度: 12345678
%8.2f意義:00000.00
如上所述,全部的寬度僅有 8 個(gè)字節(jié),整數(shù)部分占有 5 個(gè)字節(jié),小數(shù)點(diǎn)本身 (.) 占一位,小數(shù)點(diǎn)下的位數(shù)則有兩位。

【繼續(xù)荔枝】printf 除了可以格式化處理之外,他還可以依據(jù) ASCII 的數(shù)字與圖形對(duì)應(yīng)來(lái)顯示數(shù)據(jù)喔(注3)! 舉例來(lái)說(shuō) 16 進(jìn)位的 45 可以得到什么 ASCII 的顯示圖 (其實(shí)是字節(jié)啦)?
(59)
16進(jìn)制45 = 16*4+5 = 69, 而65~90 = A~Z;所以69表示E;

【12.4.2】awk:好用的數(shù)據(jù)處理工具
1)相較於 sed 常常作用於一整個(gè)行的處理,awk 則比較傾向於一行當(dāng)中分成數(shù)個(gè)『欄位』來(lái)處理。因此,awk 相當(dāng)?shù)倪m合處理小型的數(shù)據(jù)數(shù)據(jù)處理呢!
2)awk 通常運(yùn)行的模式是這樣的:??
[root@www ~]# awk '條件類型1{動(dòng)作1} 條件類型2{動(dòng)作2} ...' filename
awk 后面接兩個(gè)單引號(hào)并加上大括號(hào) {} 來(lái)配置想要對(duì)數(shù)據(jù)進(jìn)行的處理動(dòng)作。 awk 可以處理后續(xù)接的文件,也可以讀取來(lái)自前個(gè)命令的 standard output 。

總結(jié):awk 主要是處理『每一行的欄位內(nèi)的數(shù)據(jù)』,而默認(rèn)的『欄位的分隔符號(hào)為 "空白鍵" 或 "[tab]鍵" 』;

【荔枝】
(60)
分析1:由上面這個(gè)例子你也會(huì)知道,在每一行的每個(gè)欄位都是有變量名稱的,那就是 $1, $2... 等變量名稱。$0 代表『一整列數(shù)據(jù)』的意思~。
分析2:上述荔枝的整個(gè) awk 的處理流程是:
? 1. 讀入第一行,并將第一行的數(shù)據(jù)填入 $0, $1, $2.... 等變量當(dāng)中;
? 2. 依據(jù) "條件類型" 的限制,判斷是否需要進(jìn)行后面的 "動(dòng)作";
? 3. 做完所有的動(dòng)作與條件類型;
? 4. 若還有后續(xù)的『行』的數(shù)據(jù),則重復(fù)上面 1~3 的步驟,直到所有的數(shù)據(jù)都讀完為止。
經(jīng)過(guò)這樣的步驟,你會(huì)曉得, awk 是『以行為一次處理的單位』, 而『以欄位為最小的處理單位』。

3)awk 怎么知道我到底這個(gè)數(shù)據(jù)有幾行?有幾欄呢?這就需要 awk 的內(nèi)建變量的幫忙啦~
(61)
【荔枝】我們繼續(xù)以上面 last -n 5 的例子來(lái)做說(shuō)明,如果我想要:
? ● 列出每一行的帳號(hào)(就是 $1);
? ● 列出目前處理的行數(shù)(就是 awk 內(nèi)的 NR 變量)
? ● 并且說(shuō)明,該行有多少欄位(就是 awk 內(nèi)的 NF 變量)
則可以這樣:
(62)
4)awk的邏輯運(yùn)算符
(63)
【荔枝——利用 BEGIN 命令來(lái)預(yù)設(shè)了 awk變量】那假設(shè)我要查閱,第三欄小於 5 以下的數(shù)據(jù),并且僅列出帳號(hào)與第三欄, 那么可以這樣做:
(64)
有個(gè)問(wèn)題:怎么第1行沒(méi)有正確顯示出來(lái)呢?
這是因?yàn)槲覀冏x入第一行的時(shí)候,那些變量 $1, $2... 默認(rèn)還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行后才開(kāi)始生效。那么怎么辦呢?我們可以預(yù)先配置 awk 的變量啊! 利用 BEGIN 這個(gè)關(guān)鍵字喔!這樣做:
(65)
干貨:這里利用 BEGIN 命令來(lái)預(yù)設(shè)了 awk變量;

【荔枝】利用awk來(lái)進(jìn)行計(jì)算功能。對(duì)如下薪資表求總和:
[root@localhost chapter12]# cat pay.txt Name 1st 2nd 3th VBird 23000 24000 25000 DMTsai 21000 20000 23000 Bird2 43000 42000 41000求和說(shuō)明:我們可以這樣考慮:
? ● 第一行只是說(shuō)明,所以第一行不要進(jìn)行加總 (NR==1 時(shí)處理);
? ● 第二行以后就會(huì)有加總的情況出現(xiàn) (NR>=2 以后處理)
(66)
上面的例子有幾個(gè)重要事項(xiàng)應(yīng)該要先說(shuō)明的:
? ● awk 的命令間隔:所有 awk 的動(dòng)作,亦即在 {} 內(nèi)的動(dòng)作,如果有需要多個(gè)命令輔助時(shí),可利用分號(hào)『;』間隔, 或者直接以 [Enter] 按鍵來(lái)隔開(kāi)每個(gè)命令,例如上面的范例中,鳥(niǎo)哥共按了三次 [enter] 喔!
? ● 邏輯運(yùn)算當(dāng)中,如果是『等於』的情況,則務(wù)必使用兩個(gè)等號(hào)『==』!
? ● 格式化輸出時(shí),在 printf 的格式配置當(dāng)中,務(wù)必加上 \n ,才能進(jìn)行分行!
? ● 與 bash shell 的變量不同,在 awk 當(dāng)中,變量可以直接使用,不需加上 $ 符號(hào)。
(67)
cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1, $2, $3, $4, "total"};
NR>=2 {total=$2+$3+$4;
printf "%10s %10d %10d %10d %10.2f\n",$1, $2, $3, $4, total}'

【繼續(xù)荔枝】另外, awk 的動(dòng)作內(nèi) {} 也是支持 if (條件) 的喔! 舉例來(lái)說(shuō),上面的命令可以修訂成為這樣:
(68)
cat pay.txt | awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1, $2, $3, $4, "total"};
{if(NR>=2) total=$2+$3+$4;
printf "%10s %10d %10d %10d %10.2f\n",$1, $2, $3, $4, total}'
總結(jié): 第1種統(tǒng)計(jì)方法比較常用;

【12.4.3】文件比較工具
1)diff 命令:通常是用在同一的文件(或軟件)的新舊版本差異上!
(69)
【荔枝】假如我們要將 /etc/passwd 處理成為一個(gè)新的版本,處理方式為: 將第四行刪除,第六行則取代成為『no six line』,新的文件放置到 /tmp/test 里面,那么應(yīng)該怎么做?
(70)
(71)
【繼續(xù)荔枝】另外, diff 也可以比對(duì)整個(gè)目錄下的差異喔!舉例來(lái)說(shuō),我們想要了解一下不同的啟動(dòng)運(yùn)行等級(jí) (runlevel) 內(nèi)容有啥不同?假設(shè)你已經(jīng)知道運(yùn)行等級(jí) 3 與 5 的啟動(dòng)腳本分別放置到 /etc/rc3.d 及 /etc/rc5.d , 則我們可以將兩個(gè)目錄比對(duì)一下:
(72)
2)cmp命令: cmp 主要也是在比對(duì)兩個(gè)文件,他主要利用字節(jié)單位去比對(duì), 因此,當(dāng)然也可以比對(duì) binary file 羅~(還是要再提醒喔, diff 主要是以『行』為單位比對(duì), cmp 則是以字節(jié)為單位去比對(duì),這并不相同!)
(73)
【荔枝】
(74)
3)cmp命令: diff 可以用來(lái)分辨兩個(gè)版本之間的差異, 舉例來(lái)說(shuō),剛剛我們所創(chuàng)建的 passwd.old 及 passwd.new 之間就是兩個(gè)不同版本的文件。 那么,如果要『升級(jí)』呢?就是『將舊的文件升級(jí)成為新的文件』時(shí),應(yīng)該要怎么做呢? 其實(shí)也不難啦!就是『先比較先舊版本的差異,并將差異檔制作成為補(bǔ)丁檔,再由補(bǔ)丁檔升級(jí)舊文件』即可。 舉例來(lái)說(shuō),我們可以這樣做測(cè)試:
(75)
(76)
補(bǔ)充:? 以上面表格為例,新文件看到 - 會(huì)刪除,看到 + 會(huì)加入!好了,那么如何將舊的文件升級(jí)成為新的內(nèi)容呢? 就是將 passwd.old 改成與 passwd.new 相同!可以這樣做:
(77)
(78)
(79)
【12.4.4】文件打印準(zhǔn)備:pr
1) 如果我是在 Linux 底下列印純文字檔呢 可不可以具有標(biāo)題啊?可不可以加入頁(yè)碼啊?呵呵!當(dāng)然可以啊!使用 pr 就能夠達(dá)到這個(gè)功能了。
【荔枝】舉例來(lái)說(shuō),如果想要列印 /etc/man.config 呢?
(80)




總結(jié)

以上是生活随笔為你收集整理的linux-basic(12)正则表达式与文件格式化处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。