一、正則表達式 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 ...
一、正則表達式
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 參數或轉義
- 替換可使用正則表達式的子模式,即小括弧(),可以\1、\2代表子模式
【例】sed -r 's/(.)(.)/\2\1/ 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
邏輯運算(可直接引用域進行運算)
- = += -= /= *=:賦值
- && || !:邏輯與 邏輯或 邏輯非
- ~ !~:匹配正則或不匹配,正則需要用 /正則/ 包圍住
- < <= > >= != ==:關係,比較字元串時要把字元串用雙引號引起來
- $:欄位引用需要加$,而變數引用直接用變數名取
- + - * / % ++ --:運算符
轉義序列
- \\ \自身
- \$ 轉義$
- \t 製表符
- \b 退格符
- \r 回車符
- \n 換行符
- \c 取消換行
有錯誤請指正,更多詳細資料參考:
http://www.cnblogs.com/linhaifeng/p/6596660.html#_label3