Linux學習筆記(九)正規表示式

2021-06-26 20:45:49 字數 4191 閱讀 2954

**:

基礎正規表示法字元彙整(characters)

re 字元

意義與範例

^word

意義:待搜尋的字串(word)在行首!

範例:搜尋行首為 # 開始的那一行,並列出行號

grep -n '^#' regular_express.txt

word$

意義:待搜尋的字串(word)在行尾!

範例:將行尾為 ! 的那一行列印出來,並列出行號

grep -n '!$' regular_express.txt

.意義:代表『一定有乙個任意位元組』的字元!

範例:搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有乙個位元組,而空白位元組也是位元組!

grep -n 'e.e' regular_express.txt

\意義:跳脫字元,將特殊符號的特殊意義去除!

範例:搜尋含有單引號 ' 的那一行!

grep -n \' regular_express.txt

*意義:重複零個到無窮多個的前乙個 re 字元

範例:找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前乙個 re 字元』的符號, 因此,在 * 之前必須要緊接著乙個 re 字元喔!例如任意位元組則為 『.*』 !

grep -n 'ess*' regular_express.txt

[list]

意義:位元組集合的 re 字元,裡面列出想要擷取的位元組!

範例:搜尋含有 (gl) 或 (gd) 的那一行,需要特別留意的是,在 當中『謹代表乙個待搜尋的位元組』,例如『 a[afl]y 』代表搜尋的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!

grep -n 'g[ld]' regular_express.txt

[n1-n2]

意義:位元組集合的 re 字元,裡面列出想要擷取的位元組範圍!

範例:搜尋含有任意數字的那一行!需特別留意,在位元組集合 中的減號 - 是有特殊意義的,他代表兩個位元組之間的所有連續位元組!但這個連續與否與 ascii 編碼有關,因此,你的編碼需要配置正確(在 bash 當中,需要確定 lang 與 language 的變數是否正確!) 例如所有大寫位元組則為 [a-z]

grep -n '[a-z]' regular_express.txt

[^list]

意義:位元組集合的 re 字元,裡面列出不要的字串或範圍!

範例:搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 內時,代表的意義是『反向選擇』的意思。例如,我不要大寫位元組,則為 [^a-z]。但是,需要特別注意的是,如果以 grep -n [^a-z] regular_express.txt 來搜尋,卻發現該檔案內的所有行都被列出,為什麼?因為這個 [^a-z] 是『非大寫位元組』的意思,因為每一行均有非大寫位元組,例如第一行的 "open source" 就有 p,e,n,o.... 等等的小寫字

grep -n 'oo[^t]' regular_express.txt

\意義:連續 n 到 m 個的『前乙個 re 字元』

意義:若為 \ 則是連續 n 個的前乙個 re 字元,

意義:若是 \ 則是連續 n 個以上的前乙個 re 字元!範例:在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)

grep -n 'go\g' regular_express.txt

sed [-nefr] [動作]

選項與引數:

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 stdin

的資料一般都會被列出到螢幕上。但如果加上 -n 引數後,則只有經過

sed 特殊處理的那一行(或者動作)才會被列出來。

-f :直接將 sed 的動作寫在乙個檔案內, -f filename 則可以執行 filename 內的

sed 動作;

-r :sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)

-i :直接修改讀取的檔案內容,而不是由螢幕輸出。

動作說明: [n1[,n2]]function

n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作

是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

function 有底下這些咚咚:

c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!

d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;

p :列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行~

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配

正規表示法!例如 1,20s/old/new/g

範例一:將 /etc/passwd 的內容列出並且列印行號,同時,請將第 2~5 行刪除!

[root@www ~]# nl /etc/passwd | sed '2,5d'

1 root:x:0:0:root:/root:/bin/bash

6 sync:x:5:0:sync:/sbin:/bin/sync

7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sed 後面接的動作,務必以 '' 兩個單引號括住

sed 's/要被取代的字串/新的字串/g'

awk:好用的資料處理工具

awk 也是乙個非常棒的資料處理工具!相較於 sed 常常作用於一整個行的處理, awk 則比較傾向於一行當中分成數個『字段』來處理。因此,awk 相當的適合處理小型的資料資料處理,awk通常執行的模式是這樣的:

[root@www ~]# awk '條件型別1 條件型別2 ...' filename

[root@www ~]# last -n 5

<==僅取出前五行

root pts/1 192.168.1.100 tue feb 10 11:21 still logged in

root pts/1 192.168.1.100 tue feb 10 00:46 - 02:28 (01:41)

root pts/1 192.168.1.100 mon feb 9 11:41 - 18:30 (06:48)

dmtsai pts/1 192.168.1.100 mon feb 9 11:41 - 11:41 (00:00)

root tty1 fri sep 5 14:09 - 14:10 (00:01)

若我想要取出帳號與登陸者的 ip ,且帳號與 ip 之間以 [tab] 隔開,則會變成這樣:

[root@www ~]# last -n 5 | awk ''

root 192.168.1.100

root 192.168.1.100

root 192.168.1.100

dmtsai 192.168.1.100

root fri

變數名稱

代表意義

nf每一行

($0) 擁有的字段總數

nr目前 awk 所處理的是『第幾行』資料

fs目前的分隔位元組,預設是空白鍵

[root@www ~]# last -n 5| awk ''

root lines: 1 columns: 10

root lines: 2 columns: 10

root lines: 3 columns: 10

dmtsai lines: 4 columns: 10

root lines: 5 columns: 9

# 注意,在 awk 內的 nr, nf 等變數要用大寫,且不需要有錢字型大小 $ !

Linux正規表示式學習筆記

一,基本元字符集及其含義 只匹配行首位,e.g int 匹配行首是 int的行 只匹配行末,e.g 匹配行末是 的行 乙個單字元後緊跟 匹配0個或者多個該字元,比如 a 可以匹配 空字元 a 或者 aaa 匹配的字元,可以是乙個單字元,也可以是序列。比如 0 9 表示匹配數字 0,1,2,3,4,5...

Python學習 (九 正規表示式)

re模組使 python 語言擁有全部的正規表示式功能。re.match嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,就返回none,也含著true和false的判斷。re.match pattern,string,flags 0 有以下使用方式 test 使用者輸入的字串 if ...

Linux正規表示式(筆記)

用來匹配符合條件的檔名,適用於ls,find,cp命令,但是卻不能用於處理字串的。匹配1 多個字元 find system.匹配1個內容 find shad?w 匹配括號中的內容 find shado a z 但是linux中的正規表示式和萬用字元不是同乙個概念。這個需要區分。用來在檔案中匹配符合條...