Linux(6)正规表示法与文件格式化处理

一.正则表达式

①编码对正则表达式的影响

我們看到的字元文字與數字都是透過編碼表轉換來的。由於不同語系的編碼資料並不相同,所以就會造成資料擷取結果的差異了。 舉例來說,在英文大小寫的編碼順序中,zh_TW.big5 及 C 這兩種語系的輸出結果分別如下:

  • LANG=C     時:0 1 2 3 4 ... A B C D ... Z a b c d ...z
  • LANG=zh_TW 時:0 1 2 3 4 ... a A b B c C d D ... z Z

為了要避免這樣編碼所造成的英文與數字的擷取問題,因此有些特殊的符號我們得要瞭解一下的! 這些符號主要有底下這些意義:

尤其上表中的[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 這幾個一定要知道代表什麼意思,因為他要比 a-z 或 A-Z 的用途要確定的很!好了,底下就讓我們開始來玩玩進階版的 grep 吧!

②基础练习

下载一个联系文档:wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

为了方便,把这个变成环境变量  doc=regular_express.txt

1.显示“the”在第几行

2.显示没有“the”的行数

3.利用[]来选择

4.想要oo,但是前面不能有g

意思就是說,我需要的是 oo ,但是 oo 前面不能是 g 就是了!仔細比較上面兩個表格,妳會發現,第 1,9 行不見了,因為 oo 前面出現了 g 所致!第 2,3 行沒有疑問,因為 foo 與 Foo 均可被接受!但是第 18 行明明有 google 的 goo 啊~別忘記了,因為該行後面出現了 tool 的 too 啊!所以該行也被列出來~ 也就是說, 18 行裡面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 因此,是符合字串搜尋的喔!

至於第 19 行,同樣的,因為 goooooogle 裡面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,這一行也是符合需求的!

5.想要oo,但是不想在前面有小写字母

6.定位(首、尾)

the打头

小写字母大头

非字幕打头

^符号在[]里面表示反向选择,在[]外面表示打头

查找行尾,就在查找的字符字符串后面加上$.

7.通配符

  • . (小數點):代表『一定有一個任意字元』的意思;
  • * (星星號):代表『重複前一個字元, 0 到無窮多次』的意思,為組合形態

找到存在g??d的行

找到存在2个o以上的行

.* 代表0个或多个任意字符

8.限定字符

因為 { 與 } 的符號在 shell 是有特殊意義的,因此, 我們必須要使用跳脫字符 \ 來讓他失去特殊意義才行。

找到只有两个o的行

找到只有2-5个o的行

二.sed工具

我們先來談一談 sed 好了, sed 本身也是一個管線命令,可以分析 standard input 的啦! 而且 sed 還可以將資料進行取代、刪除、新增、擷取特定行等等的功能

要用的时候再学吧。

三.文件的格式化和相关处理

printf

提一句:$()=' ';

四.awk

取第一列和第五列,中间由tab隔开

上表是 awk 最常使用的動作!透過 print 的功能將欄位資料列出來!欄位的分隔則以空白鍵或 [tab] 按鍵來隔開。 因為不論哪一行我都要處理,因此,就不需要有 "條件類型" 的限制!我所想要的是第一欄以及第三欄, 但是,第五行的內容怪怪的~這是因為資料格式的問題啊!所以囉~使用 awk 的時候,請先確認一下你的資料當中,如果是連續性的資料,請不要有空格或 [tab] 在內,否則,就會像這個例子這樣,會發生誤判喔!

另外,由上面這個例子你也會知道,在 awk 的括號內,每一行的每個欄位都是有變數名稱的,那就是 $1, $2... 等變數名稱。以上面的例子來說, dmtsai 是 $1 ,因為他是第一欄嘛!至於 192.168.1.100 是第三欄, 所以他就是 $3 啦!後面以此類推~呵呵!還有個變數喔!那就是 $0 ,$0 代表『一整列資料』的意思~以上面的例子來說,第一行的 $0 代表的就是『dmtsai .... 』那一行啊! 由此可知,剛剛上面五行當中,整個 awk 的處理流程是:

  1. 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
  2. 依據 "條件類型" 的限制,判斷是否需要進行後面的 "動作";
  3. 做完所有的動作與條件類型;
  4. 若還有後續的『行』的資料,則重複上面 1~3 的步驟,直到所有的資料都讀完為止。

逻辑运算字符:

有趣吧!不過,怎麼第一行沒有正確的顯示出來呢?這是因為我們讀入第一行的時候,那些變數 $1, $2... 預設還是以空白鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先設定 awk 的變數啊! 利用 BEGIN 這個關鍵字喔!這樣做:

  • awk 的指令間隔:所有 awk 的動作,亦即在 {} 內的動作,如果有需要多個指令輔助時,可利用分號『;』間隔, 或者直接以 [Enter] 按鍵來隔開每個指令,例如上面的範例中,鳥哥共按了三次 [enter] 喔!
  • 邏輯運算當中,如果是『等於』的情況,則務必使用兩個等號『==』!
  • 格式化輸出時,在 printf 的格式設定當中,務必加上 \n ,才能進行分行!
  • 與 bash shell 的變數不同,在 awk 當中,變數可以直接使用,不需加上 $ 符號。

五.档案的对比

六.档案列印标准

猜你喜欢

转载自blog.csdn.net/weixin_38967434/article/details/83415214