正則表達式基本上是一種“表示法”,只要工具程序支持這種表示法,那么該工具程序就可以用來作為正則表達式的字符串處理只用。例如 vi,grep,awk,sed 等工具
語系對應正在表達式也會存在影響。比如
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]當 C 語系時代表的意義是獲取小寫字母。在 ZH_CN 語系時代表的意義就是獲取字母(大寫與小寫)
為了避免數(shù)字和字母的選取錯誤,正則表達式采用特殊符號來代表
[: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:]:代表標點符號字符
[:space:]:代表會產生的空白的字符如 TAB 空格 CR
[:xdigit:]:代表十六進制的數(shù)字類型 0-9 A-F a-f
舉例
[root@localhost ~]# cat xargsfile |grep -n '[[:upper:]]'
2:FRA
4:AWEE
字符 | 意義與范例 |
---|---|
^word | 意義:查找以 word 為行首的數(shù)據(jù) |
舉例:查找以#開始的那一行 gerp ‘^#’ file.txt| |Word$ |意義:查找以 word 為行尾的數(shù)據(jù) 舉例:查找以#為結尾的那一行 grep‘#$’ file.txt| |. |意義:代表一定有一個任意字符 舉例查找字符串 eae,ebe e e,ee 之間一定有一個字符,空格也算字符 G rep ‘e.e’ file.txt | | |意義:重復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|
字符 | 意義與范例 |
---|---|
+ | 意義:重復一個或一個以上的字符 |
舉例:查找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|
|()+ |意義:多個重復組的判別
舉例:找出Axy123123123C
egrep ‘Axy(123)+C’ file.txt|
說明:如 grep 需要使用擴展正則表達式,可使用 grep –e 或 egrep
sed 本身是一個也是一個管道命令。可以分析輸入數(shù)據(jù)流,還可以將數(shù)據(jù)進行替換,刪除,選去等操作
sed 與 tr 的區(qū)別
tr 操作的單元是字符,它針對字符進行刪除和替換
sed 操作單元的是行,它針對行進行刪除和替換
sed 與 vim 的區(qū)別
sed 是管道命令它修改只是輸入數(shù)據(jù)流,并不會修改文件本身。雖然 sed 也可以直接修改文件,但是不需要打開文件,對于大文件來說很有幫助
vim 是文本編輯器,它修改的是文件本身
語法:sed [-nefr] ‘動作’
選項與參數(shù):
-n:silent 模式,只將 sed 處理過的內容顯示 i 出來
-e:設置多個 sed 動作
-f filename: 文件內記錄 sed 腳本 scipt
-r:sed 支持的擴展正則表達式語法(默認是基礎正則表達式)
-i:直接修改讀取文件內容,而不是屏幕輸出
動作:n1,n2function
n1,n2不一定存在
function:
a:新增,a 后面接字符串,這些字符在當前的下一行顯示
c:替換,c 后面接字符串,這些字符替換 n1-n2之間的行
d:刪除,刪除 n1-n2之間的行
i:添加,i 后面接字符串,這些字符在當前的上一行顯示
p: 打印,打印 n1~n2行之間的數(shù)據(jù)
s: 替換以關鍵字形式替換,并不是替換整行. sed ‘s/舊字符串/新字符串/g’’
舉例:
[root@localhost ~]# cat sedfile |sed -n 'p' =>查詢所有內容
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內容
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 是一個數(shù)據(jù)處理工具,相比 sed 作用于一整行的處理,awk 則將一行分為數(shù)個“字段”處理
awk 的處理流程
1.讀入第一行,并將第一行的數(shù)據(jù)填入$0,$1,$2……等變量中
2.依據(jù)條件類型的限制,判斷是否需要后面的動作
3.做完所有的動作與條件類型
4.若還有后續(xù)的行的數(shù)據(jù),則重復1-3步驟
語法:awk ‘條件類型1 {動作1}條件類型2 {動作2}……’ filename
說明:
1.awk 默認用空格或 tab 來分割一行數(shù)據(jù),并將數(shù)據(jù)填充到$1,$2..中
如:root pts1 192這一行, $1=root $2=pts1.
運算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 賦值 |
?: | C 條件表達式 |
|| |
邏輯或 |
&& | 邏輯與 |
~ ~! | 匹配正則表達式和不匹配正則表達式 |
< <= > >= != == | 關系運算符 |
空格 | 連接 |
+ - | 加,減 |
* / & | 乘,除與求余 |
+ - ! | 一元加,減和邏輯非 |
^ *** | 求冪 |
++ -- | 增加或減少,作為前綴或后綴 |
$ | 字段引用 |
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 關鍵字
BEGIN 關鍵字作用是預設,在讀如第一行前面就執(zhí)行 BEGIN 后面的動作
比如每一行默認分割方式是空格或是 TAB,所以我們可以設置 FS 來改變分割符,但是此時第一行數(shù)據(jù)已經讀取分析完畢,列信息已經存在$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 操作將在掃描完全部的輸入之后執(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