詳解正則表達(dá)式及Linux三大文本處理工具
grep、sed和awk都是文本處理工具,雖然都是文本處理工具但卻都有各自的優(yōu)缺點(diǎn),一種文本處理命令是不能被另一個完全替換的,否則也不會出現(xiàn)三個文本處理命令了。
一、正則表達(dá)式
1、匹配字符的類型
[a-z]:小寫字母
[A-Z]:大寫字母
[a-Z]:小或大寫字母
[0-9]:數(shù)字
[a-zA-Z0-9]:表示匹配一個為字母或數(shù)字的字符
. :匹配1個任意字符,空格除外
[0-f]:16進(jìn)制數(shù)
abc | def:abc或def
a (bc | de) f:abcf 或 adef
\<:單詞頭 單詞一般以空格或特殊字符做分隔,連續(xù)的字符串被當(dāng)做單詞
\>:單詞尾
[^表達(dá)式]:除小寫字母以外的所有字符,如此類推。
2、后跟以下符號控制匹配的數(shù)量
此類符號的左側(cè)要有上面第一點(diǎn)的表達(dá)式
表達(dá)式*:0或n個字符
表達(dá)式+:1或n個字符
表達(dá)式?:0或1個字符
表達(dá)式{n}:n個字符
表達(dá)式{n:m}:n到m個字符
表達(dá)式{n,}:至少n個字符
【例】[a-z]*表示匹配0個或多個小寫字母
3、將匹配的字符控制在頭尾
^表達(dá)式:頭部符合
表達(dá)式$:尾部符合
二、Linux三大文本處理工具
1、egrep 篩選工具
grep的擴(kuò)展版,可以使用正則表達(dá)式
語法:
egrep -選項(xiàng) '正則表達(dá)式' 文件名
選項(xiàng):
-n :顯示行號
-o :只顯示匹配的內(nèi)容
-q :靜默模式,沒有任何輸出,得用$?來判斷執(zhí)行成功沒有,即有沒有過濾到想要的內(nèi)容
-l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,則將匹配行及其后n行一起打印出來
-B :如果匹配成功,則將匹配行及其前n行一起打印出來
-C :如果匹配成功,則將匹配行及其前后n行一起打印出來
--color
-c :如果匹配成功,則將匹配到的行數(shù)打印出來
-i :忽略大小寫
-v :取反,不匹配
-w:匹配單詞
2、sed 流編輯器
語法:
語法1:sed -選項(xiàng) '數(shù)字定位+命令' 文件名
選項(xiàng):
-n:靜默模式,不輸出
-e:多項(xiàng)編輯,這個不是很清楚
-i:直接修改文件內(nèi)容,而不是輸出
-r:擴(kuò)展模式,可使用正則表達(dá)式
-f:指定文件名,將動作寫在新的文件內(nèi)
命令:
a ∶ 追加append,
c ∶ 改變change,
d ∶ 刪除delete,
i ∶ 插入insert, i 的后面可以接字串,而這些字串會在新的一行出現(xiàn)(目前的上一行)
p∶ 列印print
s∶ 取代substitute,可以直接進(jìn)行替換的工作。通常這個 s 的動作可以搭配正則表達(dá)式。例如 1,20s/old/new/g
*s命令特別說明:
使用{命令1:命令2:命令3}可增加使用多個命令
語法2:sed -r '替換命令s/正則表達(dá)式/替換內(nèi)容/貪婪選項(xiàng)g' 文件名
定位的兩種方法:
①數(shù)字定位(輸入行序號定位)
十進(jìn)制數(shù)
1:單行
1,3:范圍 從第一行到第三行
2,+4:匹配行后若干行
4,~3:從第四行到下一個3的倍數(shù)行
2~3:第二行起每間隔三行的行
$:尾行
1!:除了第一行以外的行
【例】sed -n '1p' /etc/passwd
②正則表達(dá)式定位
正則必須用//包裹起來
擴(kuò)展正則需要用 -r 參數(shù)或轉(zhuǎn)義
替換可使用正則表達(dá)式的子模式,即小括號(),可以\1、\2代表子模式
【例】sed -r 's/(.)(.)/\2\1/ file1 表示將匹配到的第一部分和第二部分替換
*貪婪選項(xiàng):填上g,代表把一行中所有匹配項(xiàng)替換
3、awk 文本分析工具
由命令、正則(需要用//包圍起來)、比較和關(guān)系運(yùn)算組合而成
使用option中的-F參數(shù)定義間隔符號
用$1,$2,$3等的順序表示files中每行以間隔符號分隔的各列不同域,NF變量表示當(dāng)前記錄的字段數(shù)
語法
awk -選項(xiàng) 參數(shù) '邏輯判斷{命令 變量1,變量2,變量3}' 文件名
選項(xiàng)
-F 定義字段分隔符,默認(rèn)的分隔符是連續(xù)的空格或制表符
-v 定義變量并賦值 也可以借用次方式從shell變量中引入
AWK變量
NR 當(dāng)前記錄的個數(shù)(全部文件連接后的統(tǒng)計(jì))
FNR 當(dāng)前記錄的個數(shù)(僅為當(dāng)前文件的統(tǒng)計(jì),非全部)
FS 字段分隔符 默認(rèn)為連續(xù)空格或制表符,可以使用多個不同的符號做分隔符 -F[:/]
OFS 輸出字符的分隔符 默認(rèn)是空格
# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
root=====x
NF 當(dāng)前讀入行的字段個數(shù)
ORS 輸出記錄分隔符 默認(rèn)是換行
# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
root x=====bin x=====
FILENAME 當(dāng)前文件名
【例1】使用AWK變量
# awk '{print NR,FNR,$1}' file1 file2 1 1 aaaaa 2 2 bbbbb 3 3 ccccc 4 1 dddddd 5 2 eeeeee 6 3 ffffff #
【例2】引用shell變量的方法
# a=root # awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd 或者 把整個命令拆開傳遞,讓shell變量外露, # awk -F: '$1 == "'$a'" {print $0}' /etc/passwd # a=NF # awk -F: '{print $'$a'}' /etc/passwd
邏輯運(yùn)算(可直接引用域進(jìn)行運(yùn)算)
= += -= /= *= 賦值
&& || ! 邏輯與 邏輯或 邏輯非
~ !~ 匹配正則或不匹配,正則需要用 /正則/ 包圍住
< <= > >= != == 關(guān)系 比較字符串時要把字符串用雙引號引起來
$ 字段引用:字段引用需要加$,而變量引用直接用變量名取
+ - * / % ++ -- 運(yùn)算符
轉(zhuǎn)義序列
\\ \自身
\$ 轉(zhuǎn)義$
\t 制表符
\b 退格符
\r 回車符
\n 換行符
\c 取消換行
以上所述是小編給大家介紹的正則表達(dá)式及Linux三大文本處理工具,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
js正則表達(dá)式中的單行模式與多行模式實(shí)例分析
這篇文章主要介紹了js正則表達(dá)式中的單行模式與多行模式,實(shí)例分析了js正則表達(dá)式中實(shí)現(xiàn)單行模式與多行模式的技巧,需要的朋友可以參考下2015-01-01Java正則表達(dá)式驗(yàn)證是否包含某個字符串的示例代碼
作為一名經(jīng)驗(yàn)豐富的開發(fā)者,我將教會你如何使用Java正則表達(dá)式來驗(yàn)證是否包含某個字符串,在本文中,我將按照以下步驟來指導(dǎo)你完成操作,感興趣的朋友一起看看吧2023-12-12ajax對注冊名進(jìn)行驗(yàn)證檢測是否存在于數(shù)據(jù)庫中
使用ajax對注冊名進(jìn)行驗(yàn)證判斷它是否在數(shù)據(jù)庫中存在,具體的實(shí)現(xiàn)如下,感性的朋友可以參考下,希望對大家有所幫助2013-07-07javascript正則表達(dá)式容易被忽略的小問題整理
小問題:lastIndex只對exec()和test()方法起作用,string.match(regexp)是不會影響regexp這個正則的lastIndex屬性的,具體祥看本文2013-07-07利用正則表達(dá)式校驗(yàn)金額最多保留兩位小數(shù)實(shí)例代碼
很多不太懂正則的朋友,在遇到需要用正則校驗(yàn)數(shù)據(jù)時,往往是在網(wǎng)上去找很久,結(jié)果找來的還是不很符合要求,下面這篇文章主要給大家介紹了關(guān)于利用正則表達(dá)式校驗(yàn)金額最多保留兩位小數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08Java用正則表達(dá)式如何讀取網(wǎng)頁內(nèi)容
java用正則表達(dá)式讀取網(wǎng)頁內(nèi)容,通過抓取文章標(biāo)題及內(nèi)容,進(jìn)一步專區(qū)整個頁面的全部內(nèi)容,本文代碼簡單易懂,對java用正則表達(dá)式讀取網(wǎng)頁內(nèi)容感興趣的朋友可以參考下2015-10-10