目錄
簡介
Linux 操作文本的三大利器分別是 grep、sed 、awk,簡稱三劍客。
大師兄 awk:最擅長取列;二師兄 sed:最擅長取行;三師兄 grep:最擅長過濾。
正則表達式
元字符 | 功能 | 說明 |
^ | 匹配行首 | 表示以某個字符開頭 |
$ | 匹配行尾 | 表示以某個字符結尾 |
^$ | 空行 | 表示空行 |
. | 匹配任意單個字符,包括 0 次 | 表示匹配一個非換行符的任意字符 |
* | 匹配 0 個或多個字符 | 表示可重複的任意多個字符 |
[ ] | 匹配指定範圍內的任意單個字符 | 表示過濾中括弧內的任意單個字符 |
[^] | 匹配不在指定範圍內的字符 | 表示排除指定範圍內的字符 |
.* | 匹配任意長度任意字符,不包括 0 次 | 表示任意多個字符 |
\(..\) | 匹配子串 | 表示匹配子串 |
& | 保存搜索字符用來替換其他字符 | 表示搜索的字符來替換替他字符 |
\< |
匹配單詞的開始 | 表示單詞的開始,其後面的任意字符必須作爲單詞的首部出現 |
\> | 匹配單詞的結束 | 表示單詞的結束,其前面的任意字符必須作爲單詞的尾部出現 |
x\{m\} | 匹配字符 x 出現次數, m 次 | 表示統計字符 x 的出現次數 |
x\{m,\} | 匹配字符 x 出現次數,至少 m 次 | 表示統計字符 x 的出現次數,至少 n 次 |
x\{m,n\} | 匹配字符 x 出現次數,至少 m 次,不多於 n 次 | 表示統計字符 x 的出現次數,在 m 和 n 之間 |
\? | 匹配其前面的字符 1 次或 0 次 | 表示統計前面的字符出現 1 次或 0 次 |
*** 三位師兄閃亮登場啦 ***
大師兄 -- AWK
- awk 是對文本進行格式化的工具,適合處理比較複雜的格式處理。
- 有多個版本: 1、new awk: nawk ;2、gawk, awk
- awk 命令格式:
awk [options] 'script' file1 file2, ...
awk [options] 'PATTERN {acticon}' file1 file2, ...
格式說明:
-
pattern部分決定動作語句何時觸發及觸發事件:BEGIN、END
-
action 對數據進行處理,放在{}內指明:print、printf
-
最常用的是 print,默認以空白字符分隔
$0 代表整行,$1 代表第 1 段,$2 代表第 2 段,以此類推,$NF 代表最後一個字段,多個字段直接用逗號隔開
awk '{print $1, $2}' xxx.log
打印操作支持拼接打印,如:awk '{print "first" $1, $2}' xxx.log
4. options 參數:輸入分隔符,默認以空白字符分隔,通過 -F 選項來執行分隔符
awk -F '#' '{print $1,$2}' test
輸出分隔符,默認情況下輸出分隔符是空格,使用內置變量 OFS 來設定輸出分隔符,需要加上 -v 選項
awk -v OFS="-->" '{print $1,$2}' test
5. awk 變量
FS:輸入字段分隔符,默認空白字符,一般需要加 -F
OFS:輸出字段分隔符,默認是空格,一般需要加 -v
NF:分隔後的字段數量
NR:當前行的行號
6. pattern 模式:模式是條件,符合條件的行, awk 纔會進行處理
關係運算模式:awk -F '#' 'NF==5 {print $1}' test
如果行的分段數量爲5 的話,進行打印操作,其他的類似,如 NF>2,NF<4,$1==1234 等都是判斷條件。
awk -F '#' 'NF>=4 && NF<=5 {print $1}' test
二師兄 -- sed
- sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”,接着用 sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。
- sed 命令格式:
sed [options]... 'script' inputfile
選項
- -n:不輸出模式空間內容到屏幕,即不自動打印
- -e:多點編輯
- -f /PATH/SCRIPT_FILE:從指定文件中讀取編輯腳本
- -r:支持使用擴展正則表達式
- -i:直接編輯文件
- -i.bak:備份文件並原處編輯
script 地址定界
- 不給地址:對全文進行處理
- 單地址:
#:指定的行; $:最後一行
/pattern/:被此處模式所能夠匹配到的每一行
編輯命令
- d 刪除模式空間匹配的行,並立即啓用下一輪循環
- p 顯示符合條件的行,追加到默認輸出之後
- a [\]text1 在指定行後面追加文本,支持使用\n實現多行追加
- i [\]text 在行前面插入文本
- c [\]text 替換行爲單行或多行文本
- w /path/somefile 保存模式匹配的行至指定文件
- r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行後
- = 爲模式空間中的行打印行號
- ! 模式空間中匹配行取反處理
- s///:查找替換,支持使用其它分隔符,s@@@,s###
替換標記:
- g 行內全局替換
- p 顯示替換成功的行
- w /PATH/TO/SOMEFILE 將替換成功的行保存至文件中
實例說明:
sed -n 2p test 打印第 2 行內容
sed -n 2,5p test 打印第 2--5 行內容
sed -i 's/a/v/g' test 將文件中的 a 全部替換爲 v 「sed替換格式是:sed -i ‘s/要替換的內容/替換成的內容/g' 文件名」
mac 上執行上述命令會報錯 sed: 1: "test": undefined label 'est.txt'
解決方案:增加一個備份的追加名【sed -i '.bak' 's/a/v/g' test】
原因:mac強制要求備份,否則報錯
當然可以不使用其他備份名字,只是用'',就可以只保留一份
sed -i '' 's/a/v/g' test
三師兄 -- grep
- grep 強大的文本搜索工具,根據模式搜索文本,並將符合模式的文本行顯示出來。
- gerp 命令格式:
grep 【option】 pattern 【file】
option:
-
-i:忽略字符大小寫
-
-n:顯示匹配的行號
-
-v:顯示沒有被匹配的行
-
--color:將匹配的字符以高亮顏色標記出來
-
-c:統計匹配的行數
-
-o:僅顯示匹配到的字符串
-
-q:靜默模式,不輸出任何信息
-
-e:實現多個選項間的邏輯 or 關係
-
-v:反轉查找
-
-w:匹配整個單詞
-
-A:after ,顯示後行
-
-B:before ,顯示前行
-
-C:context,顯示前後行
-
-E:相當於 egrep,即 grep -E = egrep
實例說明:
grep -i 'b' test 在文件 test 中查找字符 b
grep -q 'abc' test 靜默執行。不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用於條件測試
grep -n 'v' test 查找包含字符 v 的行數
grep -nv 'v' test 查找不包含字符 v 的行數
grep -n v$ test 查找以 v 結尾的行
grep -v 'v' test 反向查找
grep 'ljl' -A 2 test 輸出匹配結果行的後 2 行
grep 'wooow' -B 2 test 輸出匹配結果行的前 2 行
grep 'wooow' -C 2 test 輸出匹配結果行的前後 2 行
grep -n 'abc' test1 test2 test3 或 grep -n 'abc' test* 多個文件查找匹配的結果行
(#^.^#)---我是有底線的---(#^.^#)