鍍金池/ 教程/ Linux/ 正則表達(dá)式與其應(yīng)用
Linux 學(xué)習(xí)記錄--開機(jī)掛載錯誤
日志系統(tǒng)
數(shù)據(jù)流重定向
內(nèi)存交換空間的構(gòu)建
文件系統(tǒng)簡介
Linux 學(xué)習(xí)記錄--軟件安裝 RPM|SRPM|YUM
文件特殊權(quán)限
目錄配置 FHS
文件內(nèi)容查閱
Boot Loader
文件壓縮
Linux 學(xué)習(xí)記錄--文件權(quán)限
Linux 命令縮寫
命令與文件的查詢
文件|目錄的默認(rèn)權(quán)限與隱藏權(quán)限
shell script
服務(wù)
Linux 學(xué)習(xí)記錄--程序編譯與函數(shù)庫
正則表達(dá)式與其應(yīng)用
關(guān)機(jī)相關(guān)指令
shell
vim 與 vi 常用命令
系統(tǒng)調(diào)用:進(jìn)程控制
文件系統(tǒng)簡單操作
磁盤掛載與卸載
有名管道通訊
磁盤分區(qū),格式化與檢驗
工作管理與進(jìn)程管理
匿名管道通訊
Linux 學(xué)習(xí)記錄--啟動流程
文件與目錄管理
管道命令
命名別名與歷史命令
文件備份|還原
shell變量
Linux 學(xué)習(xí)記錄--ACL 權(quán)限控制
內(nèi)核|內(nèi)核模塊編譯
文件管理相關(guān)系統(tǒng)編程

正則表達(dá)式與其應(yīng)用

數(shù)據(jù)處理工具:awk ,sed

正則表達(dá)式基本上是一種“表示法”,只要工具程序支持這種表示法,那么該工具程序就可以用來作為正則表達(dá)式的字符串處理只用。例如 vi,grep,awk,sed 等工具

正則表達(dá)式特殊符號

語系對應(yīng)正在表達(dá)式也會存在影響。比如
LANG=C 時:0 1 2 3 4 … A B C D ..Z a b c d ..z
LANG=ZH_CN 時:0 1 2 3 4 …a A b B c C d D …….
因此[a-z]當(dāng) C 語系時代表的意義是獲取小寫字母。在 ZH_CN 語系時代表的意義就是獲取字母(大寫與小寫)
為了避免數(shù)字和字母的選取錯誤,正則表達(dá)式采用特殊符號來代表
[:alnum:]:代表英文大小寫字符及數(shù)字。A-Z a-z 0-9
[:alpha:]:代表英文大小寫字符 A-Z a-z
[:blank:]:代表空格與 TAB 鍵
[:cntrl:]:代表鍵盤上的控制按鍵 CR,LF,TAB,DEL 等
[:digit:]:代表數(shù)據(jù) 0-9
[:graph:]:代表除了空格與 TAB 鍵的其他所有按鍵

[:upper:]:代表大寫字符
[:print:]:代表任何可以被打印出來了的字符
[:punct:]:代表標(biāo)點(diǎn)符號字符
[:space:]:代表會產(chǎn)生的空白的字符如 TAB 空格 CR
[:xdigit:]:代表十六進(jìn)制的數(shù)字類型 0-9 A-F a-f
舉例
[root@localhost ~]# cat xargsfile |grep -n '[[:upper:]]'
2:FRA
4:AWEE

基礎(chǔ)正則表達(dá)式字符

字符 意義與范例
^word 意義:查找以 word 為行首的數(shù)據(jù)

舉例:查找以#開始的那一行 gerp ‘^#’ file.txt| |Word$ |意義:查找以 word 為行尾的數(shù)據(jù) 舉例:查找以#為結(jié)尾的那一行 grep‘#$’ file.txt| |. |意義:代表一定有一個任意字符 舉例查找字符串 eae,ebe e e,ee 之間一定有一個字符,空格也算字符 G rep ‘e.e’ file.txt | | |意義:重復(fù)0個到無窮個前一個字符 舉例:查找含有 es ess esss 等的字符串 grep ‘ess’ file.txt | |[] |意義:從字符集合中找出想要選取的字符 舉例:查找含有 gl 或 gd 的那一行 grep ‘g[ld]’ file.txt| |[n1-n2] |意義:從字符集合里找出想要選取的字符范圍 舉例:查找含有任意數(shù)字的哪一行 grep ‘[0-9]’ file.txt| |[^] |意義:從字符集合中找處不要的字符或范圍 舉例:查找不含大寫字母的那一行 grep ‘[^A-Z]’ file.txt| |{n,m}|意義:連續(xù) n 個到 m 個的前一個字符,如{n}則是連續(xù)n個前一個字符,如{n,}則是連續(xù) n 個以上前一個字符 舉例1:查找 g 與 g 之間包含2個到3個 o 的字符串如:goog gooog grep ‘{2,\3}’ file.txt 舉例2:查找 g 與 g 之間包含2個 o 的字符串如:goog grep ‘{2}’ file.txt 舉例3:查找 g 與 g 之間包含3個及以上 o 的字符串如:gooog,gooood,goo….od grep ‘{3,}’ file.txt|

擴(kuò)展正則表達(dá)式

字符 意義與范例
+ 意義:重復(fù)一個或一個以上的字符

舉例:查找god,good,good等字符串 egrep ‘go+d’ file.txt| |? |意義:0個過1個前一個字符 舉例:查找gd god egrep ‘go?d’ file.txt| |||意義:用或的方式找出數(shù)個字符串 舉例:找出my ,own egrep ‘my|own’ file.txt| |() |意義:找出“組“的字符串 舉例:找出good 或glad egrep ‘g(oo|la)d’ file.txt| |()+ |意義:多個重復(fù)組的判別 舉例:找出Axy123123123C egrep ‘Axy(123)+C’ file.txt|

說明:如 grep 需要使用擴(kuò)展正則表達(dá)式,可使用 grep –e 或 egrep

sed

sed 本身是一個也是一個管道命令??梢苑治鲚斎霐?shù)據(jù)流,還可以將數(shù)據(jù)進(jìn)行替換,刪除,選去等操作
sed 與 tr 的區(qū)別
tr 操作的單元是字符,它針對字符進(jìn)行刪除和替換
sed 操作單元的是行,它針對行進(jìn)行刪除和替換 sed 與 vim 的區(qū)別
sed 是管道命令它修改只是輸入數(shù)據(jù)流,并不會修改文件本身。雖然 sed 也可以直接修改文件,但是不需要打開文件,對于大文件來說很有幫助
vim 是文本編輯器,它修改的是文件本身
語法:sed [-nefr] ‘動作’
選項與參數(shù)
-n:silent 模式,只將 sed 處理過的內(nèi)容顯示 i 出來
-e:設(shè)置多個 sed 動作
-f filename: 文件內(nèi)記錄 sed 腳本 scipt
-r:sed 支持的擴(kuò)展正則表達(dá)式語法(默認(rèn)是基礎(chǔ)正則表達(dá)式)
-i:直接修改讀取文件內(nèi)容,而不是屏幕輸出
動作:n1,n2function
n1,n2不一定存在
function:
a:新增,a 后面接字符串,這些字符在當(dāng)前的下一行顯示
c:替換,c 后面接字符串,這些字符替換 n1-n2之間的行
d:刪除,刪除 n1-n2之間的行
i:添加,i 后面接字符串,這些字符在當(dāng)前的上一行顯示
p: 打印,打印 n1~n2行之間的數(shù)據(jù)
s: 替換以關(guān)鍵字形式替換,并不是替換整行. sed ‘s/舊字符串/新字符串/g’’
舉例

[root@localhost ~]# cat sedfile |sed -n 'p' =>查詢所有內(nèi)容  
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
[root@localhost ~]# cat sedfile |sed -n '1,4p'=>查詢1~4內(nèi)容
line 1
line 2
line 3
line 4
[root@localhost ~]# cat sedfile |sed '2a new line'|sed -n '1,5p'
=>在第2行下添加新的一行
line 1
line 2
new line
line 3
line 4
[root@localhost ~]# cat sedfile |sed '3d'|sed -n '1,4p'
=>刪除第3行
line 1
line 2
line 4
line 5
[root@localhost ~]# cat sedfile |sed '2i insert line'|sed -n '1,5p'
=>在第2行上添加新的一行
line 1
insert line
line 2
line 3
line 4
[root@localhost ~]# cat sedfile |sed '2,3c replace line'|sed -n '1,3p'
=>替換2~3行
line 1
replace line
line 4
[root@localhost ~]# cat sedfile |sed '1,3s/ne/NEL/g'|sed -n '1,6p'
=>用 NEL 替換2~3行的 ne
liNEL 1
liNEL 2
liNEL 3
line 4
line 5
line 6

舉例2:使用 sed 直接修改文件

[root@localhost ~]# sed -i '$a this is line' sedfile ;cat sedfile|tail -n 2
line 10
this is line

awk

(awk 功能很強(qiáng)大,這里只是功能介紹性說明)
Awk 是一個數(shù)據(jù)處理工具,相比 sed 作用于一整行的處理,awk 則將一行分為數(shù)個“字段”處理
awk 的處理流程
1.讀入第一行,并將第一行的數(shù)據(jù)填入$0,$1,$2……等變量中
2.依據(jù)條件類型的限制,判斷是否需要后面的動作
3.做完所有的動作與條件類型
4.若還有后續(xù)的行的數(shù)據(jù),則重復(fù)1-3步驟
語法:awk ‘條件類型1 {動作1}條件類型2 {動作2}……’ filename
說明
1.awk 默認(rèn)用空格或 tab 來分割一行數(shù)據(jù),并將數(shù)據(jù)填充到$1,$2..中
如:root pts1 192這一行, $1=root $2=pts1.

  1. awk 后方語句中非變量需使用雙引號來定義,變量可以直接使用
    awk 內(nèi)置變量
運(yùn)算符 描述
= += -= *= /= %= ^= **= 賦值
?: C 條件表達(dá)式
|| 邏輯或
&& 邏輯與
~ ~! 匹配正則表達(dá)式和不匹配正則表達(dá)式
< <= > >= != == 關(guān)系運(yùn)算符
空格 連接
+ - 加,減
* / & 乘,除與求余
+ - ! 一元加,減和邏輯非
^ *** 求冪
++ -- 增加或減少,作為前綴或后綴
$ 字段引用
in 數(shù)組成員

舉例1:查看$1 NR NF

[root@bogon ~]# last -n 5 | awk '{print $1 "\t lines: " NR "\t cols: "NF }'
root     lines: 1        cols: 10
root     lines: 2        cols: 9
root     lines: 3        cols: 9
reboot   lines: 4        cols: 9
root     lines: 5        cols: 10

舉例2:帶有條件的,僅輸出$1==root 的數(shù)據(jù)

[root@bogon ~]# last -n 5 | awk '$1=="root" {print $1 "\t lines: " NR "\t cols: "NF }'
root     lines: 1        cols: 10
root     lines: 2        cols: 9
root     lines: 3        cols: 9
root     lines: 5        cols: 10

awk 關(guān)鍵字

BEGIN

BEGIN 關(guān)鍵字作用是預(yù)設(shè),在讀如第一行前面就執(zhí)行 BEGIN 后面的動作
比如每一行默認(rèn)分割方式是空格或是 TAB,所以我們可以設(shè)置 FS 來改變分割符,但是此時第一行數(shù)據(jù)已經(jīng)讀取分析完畢,列信息已經(jīng)存在$1,$2..中,改變只能從第2行開始。
舉例

[root@bogon ~]# cat /etc/passwd|head -n 5 |awk 'BEGIN {FS=":"} NR=="1" {print"UID\tGID"} NR>="1" {print $1 "\t" $3}'
UID     GID
root    0
bin     1
daemon  2
adm     3
lp      4

舉例2 計算數(shù)據(jù)(num1+num2)

數(shù)據(jù)文件
month:num1:num2
1:100:150
2:200:250
3:300:350
4:400:450
5:500:550
6:600:650

[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3}'
month   num1    num2    total
1       100     150     250
2       200     250     450
3       300     350     650
4       400     450     850
5       500     550     1050
6       600     650     1250

END

END 操作將在掃描完全部的輸入之后執(zhí)行

舉例

[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3} END {print "sum"}'
month   num1    num2    total
1       100     150     250
2       200     250     450
3       300     350     650
4       400     450     850
5       500     550     1050
6       600     650     1250
sum
上一篇:文件備份|還原下一篇:管道命令