最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

正則表達(dá)式文本處理與grep/sed/awk用法實例代碼

 更新時間:2026年07月20日 08:41:59   作者:weixin_53776580  
grep 、 sed 和 awk 的功能遠(yuǎn)不止于此,它們都支持正則表達(dá)式,可以進(jìn)行復(fù)雜的文本匹配和處理,這篇文章主要介紹了正則表達(dá)式文本處理與grep/sed/awk用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

正則表達(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)文章

最新評論

易门县| 大同市| 邢台市| 荣成市| 桦南县| 庆元县| 丰县| 遂平县| 新昌县| 黔江区| 定襄县| 紫云| 积石山| 祥云县| 文昌市| 青阳县| 安龙县| 敖汉旗| 桦南县| 吉安县| 平昌县| 马山县| 古浪县| 五莲县| 长葛市| 敖汉旗| 鲁甸县| 温州市| 阿尔山市| 横峰县| 宁津县| 平阴县| 孟津县| 八宿县| 浪卡子县| 枣庄市| 柘城县| 吉水县| 东乌珠穆沁旗| 海淀区| 和顺县|