正則表達(dá)式文本處理與grep/sed/awk用法實例代碼
正則表達(dá)式
常用的正則表達(dá)式元字符及其含義:
1. 字符匹配:
.: 匹配任意單個字符(除了換行符)[ ]: 匹配括號內(nèi)的任意一個字符[^ ]: 匹配不在括號內(nèi)的任意一個字符\char: 轉(zhuǎn)義字符,使char失去特殊含義
2. 預(yù)定義字符類:
\d: 匹配一個數(shù)字,等同于[0-9](注意:在BRE中可能不支持,通常使用[0-9])\D: 匹配非數(shù)字,等同于[^0-9]\w: 匹配字母、數(shù)字、下劃線,等同于[A-Za-z0-9_]\W: 匹配非字母、數(shù)字、下劃線\s: 匹配空白字符(空格、制表符、換行符等)\S: 匹配非空白字符
3. 數(shù)量詞:
*: 匹配前面的子表達(dá)式零次或多次,例如a*匹配 “”, “a”, “aa”, …+: 匹配前面的子表達(dá)式一次或多次,a+匹配 “a”, “aa”, …?: 匹配前面的子表達(dá)式零次或一次,a?匹配 “”, “a”{n}: 匹配確定的n次,a{3}匹配 “aaa”{n,}: 匹配至少n次,a{2,}匹配 “aa”, “aaa”, …{n,m}: 匹配至少n次,最多m次,a{2,4}匹配 “aa”, “aaa”, “aaaa”
4. 位置錨定:
^: 匹配字符串的開始$: 匹配字符串的結(jié)束\<: 匹配單詞的開始\>: 匹配單詞的結(jié)束
5. 分組與捕獲:
( ): 將括號內(nèi)的內(nèi)容作為一個分組,并捕獲匹配的文本(在BRE中需要轉(zhuǎn)義為\( \))(?: ): 非捕獲分組,不捕獲匹配的文本(在ERE中可用)
6. 或操作:
|: 匹配左右任意一個表達(dá)式(在BRE中需要轉(zhuǎn)義為\|)
grep
基本語法:
grep [選項] 模式 [文件...]
常用選項:
-i:不區(qū)分大小寫
# 搜索 hello,不區(qū)分大小寫 grep -i "hello" file.txt # 實際應(yīng)用:搜索日志中的錯誤信息 grep -i "error\|warning\|critical" /var/log/syslog # 搜索配置文件中的設(shè)置(忽略大小寫) grep -i "server_name" nginx.conf
-v:反向過濾
# 排除包含注釋的行 grep -v "^#" config.conf # 排除空行 grep -v "^$" file.txt # 排除注釋和空行 grep -v "^#\|^$" config.conf # 實際應(yīng)用:查看非本地IP的連接 netstat -an | grep "ESTABLISHED" | grep -v "127.0.0.1"
-o:只輸出匹配的關(guān)鍵字
# 只提取IP地址
grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log
# 只提取郵箱地址
grep -oE "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" users.txt
# 實際應(yīng)用:統(tǒng)計關(guān)鍵詞出現(xiàn)次數(shù)
grep -o "error" app.log | wc -l
-E:使用擴展正則表達(dá)式
# 基本正則表達(dá)式(需要轉(zhuǎn)義)
grep "go\{2,\}d" file.txt # 匹配 good, goood, gooood 等
# 擴展正則表達(dá)式(不需要轉(zhuǎn)義)
grep -E "go{2,}d" file.txt
# 或者使用 egrep(等價于 grep -E)
egrep "go{2,}d" file.txt
# 實際應(yīng)用:匹配多種模式
grep -E "error|warning|critical" system.log
-c:統(tǒng)計匹配行數(shù)
# 統(tǒng)計包含error的行數(shù) grep -c "error" app.log # 統(tǒng)計不同用戶登錄次數(shù) grep -c "user1" auth.log grep -c "user2" auth.log # 實際應(yīng)用:監(jiān)控錯誤頻率 error_count=$(grep -c "ERROR" /var/log/app.log) echo "錯誤數(shù)量: $error_count"
awk
? awk是一種文本處理工具,非常適合處理結(jié)構(gòu)化數(shù)據(jù)(如CSV、日志等)。它逐行處理文本,并可以對每行進(jìn)行分割成字段(列)然后處理。
基本格式
awk [-F"分隔符"] '模式 {動作}' 文件名
① awk 文本列處理
基本列操作
# 打印指定列
awk '{print $1}' test.txt # 打印第一列(姓名)
awk '{print $1, $3}' test.txt # 打印第一列和第三列
awk '{print $NF}' test.txt # 打印最后一列(NF=字段數(shù)量)
awk '{print $(NF-1)}' test.txt # 打印倒數(shù)第二列
② -F 分隔符詳解
不同分隔符的使用
# 逗號分隔
awk -F"," '{print $1, $3}' data.csv
# 冒號分隔
awk -F":" '{print $2}' config.conf
# 多個分隔符
awk -F"[,:]" '{print $1, $3}' data.csv
# 默認(rèn)空格分隔(可以省略 -F" ")
awk '{print $1, $2}' test.txt
③ 位置參數(shù)和輸出控制
位置參數(shù)操作
# 基本位置參數(shù)
awk '{print $1}' test.txt # 第一列
awk '{print $2, $4}' test.txt # 第二和第四列
awk '{print $0}' test.txt # 整行內(nèi)容
# 列運算和拼接
awk '{print "姓名:" $1, "薪資:" $4}' test.txt
awk '{print $1 "-" $3, "工資:" $4*1.1}' test.txt
awk '{print toupper($1), tolower($3)}' test.txt
格式化輸出
# 使用printf格式化
awk '{printf "%-10s %-8s %-10s %-8s\n", $1, $2, $3, $4}' test.txt
# 表頭+數(shù)據(jù)
awk 'BEGIN{printf "%-10s %-8s %-10s %-8s\n", "姓名", "年齡", "職業(yè)", "工資"} {printf "%-10s %-8s %-10s %-8s\n", $1, $2, $3, $4}' test.txt
④ NR 行號控制
行范圍選擇
# 從第2行開始處理
awk 'NR>=2{print $1, $3}' test.txt
# 處理特定行范圍 (2-3行)
awk 'NR>=2 && NR<=3{print NR ":", $0}' test.txt
# 跳過第一行(表頭)
awk 'NR>1{print $0}' test.txt
# 只處理奇數(shù)行
awk 'NR%2==1{print NR, $0}' test.txt
# 只處理偶數(shù)行
awk 'NR%2==0{print NR, $0}' test.txt
sed
sed(Stream Editor)是一個強大的文本處理工具,用于對文本進(jìn)行過濾和轉(zhuǎn)換。它按行處理文本,支持正則表達(dá)式。
基本語法
bash
sed [選項] '命令' 輸入文件
常用選項
-n:禁止默認(rèn)輸出,只有經(jīng)過sed處理的行才會被輸出-e:允許執(zhí)行多個腳本-f:從文件中讀取sed腳本-i:直接修改文件內(nèi)容(小心使用)-r:使用擴展正則表達(dá)式
基本命令
s:替換d:刪除p:打印a:追加i:插入c:替換行
示例
替換操作
# 將每行第一個出現(xiàn)的old替換為new sed 's/old/new/' file.txt # 全局替換(每行所有出現(xiàn)的old替換為new) sed 's/old/new/g' file.txt # 替換第N次出現(xiàn)的匹配 sed 's/old/new/2' file.txt # 替換第二次出現(xiàn) sed 's/old/new/2g' file.txt # 從第二次開始替換所有 # 使用其他分隔符,例如替換路徑中的斜杠 sed 's|/usr/local|/usr|g' file.txt # 刪除行尾的空格 sed 's/[[:space:]]*$//' file.txt # 刪除行首的空格 sed 's/^[[:space:]]*//' file.txt
刪除操作
# 刪除包含pattern的行 sed '/pattern/d' file.txt # 刪除第N行 sed 'Nd' file.txt sed '5d' file.txt # 刪除第5行 # 刪除范圍 sed '2,5d' file.txt # 刪除2-5行 sed '10,$d' file.txt # 刪除第10行到最后 # 刪除空行 sed '/^$/d' file.txt # 刪除注釋行(以#開頭) sed '/^#/d' file.txt
打印操作
# 打印匹配的行(通常與-n選項一起使用) sed -n '/pattern/p' file.txt # 打印范圍 sed -n '2,5p' file.txt # 打印2-5行 # 打印奇數(shù)行 sed -n '1~2p' file.txt # 打印偶數(shù)行 sed -n '2~2p' file.txt
追加、插入和替換行
# 在匹配行后追加 sed '/pattern/a\追加的內(nèi)容' file.txt # 在匹配行前插入 sed '/pattern/i\插入的內(nèi)容' file.txt # 替換整行 sed '/pattern/c\新的內(nèi)容' file.txt
高級用法
多命令執(zhí)行
# 使用多個-e選項 sed -e 's/foo/bar/g' -e '/^#/d' file.txt # 使用分號分隔 sed 's/foo/bar/g; /^#/d' file.txt # 使用多個表達(dá)式 sed -e 's/foo/bar/g' -e 's/hello/world/g' file.txt
使用保持空間
# 反轉(zhuǎn)文件行序 sed '1!G;h;$!d' file.txt # 每兩行合并為一行 sed 'N;s/\n/ /' file.txt
分組和反向引用
# 使用基本正則表達(dá)式分組
sed 's/\(foo\) \(bar\)/\2 \1/' file.txt
# 使用擴展正則表達(dá)式(-r)
sed -r 's/(foo) (bar)/\2 \1/' file.txt
# 日期格式轉(zhuǎn)換
echo "2023-12-25" | sed -r 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
注:
grep ,awk ,sed的處理邏輯是什么?
| 工具 | 處理模型 | 核心邏輯 | 適用場景 |
|---|---|---|---|
| grep | 行過濾模型 | 逐行掃描,匹配模式,輸出匹配的行 | 文本搜索、過濾 |
| awk | 字段處理模型 | 按字段分割,編程式處理,支持復(fù)雜邏輯 | 結(jié)構(gòu)化數(shù)據(jù)處理、報表生成 |
| sed | 流編輯模型 | 逐行讀取,執(zhí)行編輯命令,輸出結(jié)果 | 文本轉(zhuǎn)換、批量編輯 |
總結(jié)
到此這篇關(guān)于正則表達(dá)式文本處理與grep/sed/awk用法的文章就介紹到這了,更多相關(guān)正則表達(dá)式文本處理grep/sed/awk內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript 正則表達(dá)式之RegExp屬性、方法及應(yīng)用分析
RegExp對象(至今為止我看到過的最通俗易懂和深入的正則表達(dá)式教程)JavaScript提供了一個RegExp對象來完成有關(guān)正則表達(dá)式的操作和功能,每一條正則表達(dá)式模式對應(yīng)一個RegExp實例。有兩種方式可以創(chuàng)建RegExp對象的實例。2009-12-12
正則表達(dá)式實現(xiàn)將MM/DD/YYYY格式的日期轉(zhuǎn)換為YYYY-MM-DD格式
這篇文章主要介紹了正則表達(dá)式實現(xiàn)將MM/DD/YYYY格式的日期轉(zhuǎn)換為YYYY-MM-DD格式的方法,是一個比較簡單實用的正則替換應(yīng)用,對于怎能則表達(dá)式的學(xué)習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12
JS正則表達(dá)式匹配檢測各種數(shù)值類型(數(shù)字驗證)
這篇文章主要介紹了JS正則表達(dá)式匹配檢測各種數(shù)值類型(數(shù)字驗證)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2016-08-08
正則表達(dá)式其實就是一個特殊的字符串,如果需要對字符串的內(nèi)容進(jìn)行分析匹配,正則表達(dá)式是一個不錯的選擇。簡單的用String也能實現(xiàn)該過程,但是那會相當(dāng)?shù)姆爆?/div> 2012-10-10最新評論

