一、正則表達式
1、匹配字符的類型
-
[a-z]:小寫字母
-
[A-Z]:大寫字母
-
[a-Z]:小或大寫字母
-
[0-9]:數字
-
[a-zA-Z0-9]:表示匹配一個為字母或數字的字符
-
. :匹配1個任意字符,空格除外?
-
[0-f]:16進制數
-
abc | def:abc或def
-
a (bc | de) f:abcf 或 adef
-
>:單詞尾
-
[^表達式]:除小寫字母以外的所有字符,如此類推。
2、后跟以下符號控制匹配的數量
此類符號的左側要有上面第一點的表達式
-
表達式*:0或n個字符
-
表達式+:1或n個字符
-
表達式?:0或1個字符
-
表達式{n}:n個字符
-
表達式{n:m}:n到m個字符
-
表達式{n,}:至少n個字符
【例】[a-z]*表示匹配0個或多個小寫字母
3、將匹配的字符控制在頭尾
-
^表達式:頭部符合
-
表達式$:尾部符合
?
二、linux三大文本處理工具
1、egrep 篩選工具
grep的擴展版,可以使用正則表達式
語法:
egrep -選項 ?‘正則表達式’ ?文件名
選項:
-
-n :顯示行號
-
-o :只顯示匹配的內容
-
-q :靜默模式,沒有任何輸出,得用$?來判斷執行成功沒有,即有沒有過濾到想要的內容
-
-l :如果匹配成功,則只將文件名打印出來,失敗則不打印,通常-rl一起用,grep -rl ‘root’ /etc
-
-A :如果匹配成功,則將匹配行及其后n行一起打印出來
-
-B :如果匹配成功,則將匹配行及其前n行一起打印出來
-
-C :如果匹配成功,則將匹配行及其前后n行一起打印出來
-
–color
-
-c :如果匹配成功,則將匹配到的行數打印出來
-
-i :忽略大小寫
-
-v :取反,不匹配
-
-w:匹配單詞
2、sed 流編輯器
語法:
語法1:sed ?-選項 ?‘數字定位+命令’ ?文件名
選項:
-
-n:靜默模式,不輸出
-
-e:多項編輯,這個不是很清楚
-
-i:直接修改文件內容,而不是輸出
-
-r:擴展模式,可使用正則表達式
-
-f:指定文件名,將動作寫在新的文件內
定位:
①數字定位(輸入行序號定位)
-
1:單行?
-
1,3:范圍 從第一行到第三行
-
2,+4:匹配行后若干行
-
4,~3:從第四行到下一個3的倍數行
-
2~3:第二行起每間隔三行的行
-
$:尾行
-
1!:除了第一行以外的行
【例】sed -n ‘1p’ /etc/passwd
②正則表達式定位
-
正則必須用//包裹起來
-
擴展正則需要用 -r 參數或轉義
-
替換可使用正則表達式的子模式,即小括號(),可以、代表子模式
【例】sed -r ‘s/(.)(.)// file1 表示將匹配到的第一部分和第二部分替換
*貪婪選項:填上g,代表把一行中所有匹配項替換
命令:
-
a ∶ 追加append,?
-
c ∶ 改變change,?
-
d ∶ 刪除delete,
-
i ∶ 插入insert, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)
-
p∶ 列印print
-
s∶ 取代substitute,可以直接進行替換的工作。通常這個 s 的動作可以搭配正則表達式。例如 1,20s/old/new/g
*s命令特別說明:
使用{命令1:命令2:命令3}可增加使用多個命令
s命令語法:sed ?-r ?‘替換命令s/正則表達式/替換內容/貪婪選項g’ ?文件名
3、awk 文本分析工具
由命令、正則(需要用//包圍起來)、比較和關系運算組合而成
使用option中的-F參數定義間隔符號
用$1,$2,$3等的順序表示files中每行以間隔符號分隔的各列不同域,NF變量表示當前記錄的字段數
語法
awk -選項 參數 ?‘邏輯判斷{命令 變量1,變量2,變量3}’ 文件名
選項
-
-F 定義字段分隔符,默認的分隔符是連續的空格或制表符
-
-v 定義變量并賦值 也可以借用次方式從shell變量中引入
AWK變量
-
NR 當前記錄的個數(全部文件連接后的統計)
-
FNR 當前記錄的個數(僅為當前文件的統計,非全部)
-
FS 字段分隔符 默認為連續空格或制表符,可以使用多個不同的符號做分隔符 -F[:/]
-
OFS 輸出字符的分隔符 默認是空格
【OFS例】
# awk -F: ‘OFS=”=====” {print $1,$2}’ /etc/passwd
root=====x
-
NF 當前讀入行的字段個數
-
ORS 輸出記錄分隔符 默認是換行
【ORS例】
# awk -F: ‘ORS=”=====” {print $1,$2}’ /etc/passwd
root x=====bin x=====
-
FILENAME 當前文件名
【例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
?
邏輯運算(可直接引用域進行運算)
-
= += -= /= *=:賦值
-
&& || !:邏輯與 邏輯或 邏輯非
-
~ !~:匹配正則或不匹配,正則需要用 /正則/ 包圍住
-
>= != ==:關系,比較字符串時要把字符串用雙引號引起來
-
$:字段引用需要加$,而變量引用直接用變量名取
-
+ – * / % ++ –:運算符
轉義序列
-
自身
-
$ 轉義$
-
制表符
-
退格符
-
回車符
-
換行符
-
c 取消換行
??
有錯誤請指正,更多詳細資料參考: