欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shell正則表達(dá)式、grep命令和sed命令舉例詳解

 更新時(shí)間:2024年02月19日 10:32:42   作者:小蜜蜂~嗡嗡嗡~  
正則表達(dá)式就是用于描述這些規(guī)則的工具,換句話說正則表達(dá)式就是記錄文本規(guī)則的代碼,這篇文章主要給大家介紹了關(guān)于shell正則表達(dá)式、grep命令和sed命令的相關(guān)資料,需要的朋友可以參考下

一.正則表達(dá)式概述

1.正則表達(dá)式定義

1.1 定義

  • 使用字符串描述、匹配一系列符合某個(gè)規(guī)則的字符串

1.2 了解

  • 普通字符: 大小寫字母、數(shù)字、標(biāo)點(diǎn)符號(hào)及一些其它符號(hào)
  • 元字符: 在正則表達(dá)式中具有特殊意義的專用字符

1.3 層次分類

  • 基礎(chǔ)正則表達(dá)式
  • 擴(kuò)展正則表達(dá)式
  • 編程語言支持的高級(jí)正則表達(dá)式

1.4 linux三劍客(grep  sed  awk)支持的正則表達(dá)式

  • shell是不支持正則表達(dá)式的(shell支持的是通配符)。shell中的正則表達(dá)式只有個(gè)別命令支持的,一般常用的是Linux三劍客
支持正則的shell命令正則類型
grep默認(rèn)使用基本正則表達(dá)式(BRE)(要使用擴(kuò)展正則需要加轉(zhuǎn)義字符)
egrep 或 grep -E使用擴(kuò)展的正則表達(dá)式(ERE)
sed默認(rèn)使用基本正則表達(dá)式(BRE)
awk使用擴(kuò)展正則表達(dá)式(ERE)

2.基礎(chǔ)正則表達(dá)式的元字符

基礎(chǔ)正則表達(dá)式是常用的正則表達(dá)式部分

\表示轉(zhuǎn)義字符,去掉特殊符號(hào)的特殊含義
.匹配任意單個(gè)字符
^匹配字符串開頭的位置
$匹配字符串末尾的位置
*匹配前面的字符出現(xiàn)0~+∞
[list]匹配list列表中的一個(gè)字符(列表中只要有一個(gè)符合即可)
[^list]匹配任意非list列表中的一個(gè)字符
{n}匹配前面的子表達(dá)式n次
{n,}匹配前面的子表達(dá)式最少n次
{,n}匹配前面的子表達(dá)式最多n次
{n,m}匹配前面的子表達(dá)式n到m次
[ ]代表單個(gè)字符
\?1次或0次
^$空行
.*1~+∞

2.1 轉(zhuǎn)義字符的運(yùn)用

2.1.1 將特殊含義的字符轉(zhuǎn)換為普通字符的含義

被轉(zhuǎn)義的特殊字符轉(zhuǎn)義前的含義作用
\ =具有賦值的作用,或則進(jìn)行字符判斷
\ !取反
\ &單個(gè)&符可以將命令掛在后臺(tái)上,兩個(gè)是邏輯符號(hào)且的作用
\ $取值變量的作用

2.1.2 將普通字符轉(zhuǎn)換為特殊作用的字符

被賦予新含義的普通字符現(xiàn)在擁有的作用
\n換行
\t轉(zhuǎn)化為制表符
\w(小寫)匹配包括下劃線的任何單詞字符
\W(大寫)匹配任何非單詞字符。等通于"[^A-Za-z0-9_]"
\r轉(zhuǎn)換后是回車符
\d匹配一個(gè)數(shù)字字符
\D匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9]
\s(小寫)空白符
\S(大寫)非空白符

2.1.3 中括號(hào)表達(dá)式

普通中括號(hào)包圍的字符組,表示某個(gè)單個(gè)字符匹配中括號(hào)內(nèi)的任意字符即匹配成功

  • x[abc]z : 可以匹配包含“xaz”、“xbz”、“xcz”的字符串
  • 取反表示法: 中括號(hào)內(nèi)開頭使用 ^ ,表示只要不是中括號(hào)內(nèi)的字符就匹配   

                x[ ^abc]z : 可以匹配包含 “xdz”、“xez” 等字符串,但不能匹配包含“xaz”、“xbz”、“xcz”的字符串 

特殊元字符在中括號(hào)中匹配

  • 想要在中括號(hào)中匹配: ^ ,需要將其放在 中括號(hào)非開頭的位置 ,如:[a^]
  • 想要在中括號(hào)中匹配: - ,需要將其放在 開頭位置或結(jié)尾位置 ,如:[abc-]、[-abc]
  • 想要在中括號(hào)中匹配: ] ,需要將其放在 開頭位置 ,如:[]abc]

2.1.4 位置匹配

只匹配字符,不匹配字符

  • ^ : 匹配行首
  • $ : 匹配行尾
  • \b   匹配單詞邊界處的位置(開頭和結(jié)尾) \bword\b 等價(jià)于 \<word\>
  • \<   匹配單詞開頭處的位置
  • \>   匹配單詞結(jié)尾處的位置
  • \B   匹配非單詞邊界處的位置

2.1.5 字符類

[:alnum:]字母和數(shù)字
[:alpha:]代表任何英文大小寫字母 A-Z  a-z
[:lower:]小寫字母
[:upper:]大寫字母
[:blank:]空白字符
[:space:]包括空格、制表符 (水平和垂直)、換行符、回車符等各種類型的空白,比[:blank:]包含的范圍廣
[:cntrl:]不可打印的控制字符(退格、刪除、警鈴...)
[:digit:]十進(jìn)制數(shù)字
[:xdigit:]十六進(jìn)制數(shù)字
[:graph:]可打印的非空白字符
[:print:]可打印字符
[:punct:]標(biāo)點(diǎn)符號(hào)

2.1.6 量詞

\{m\} : 表示匹配前一個(gè)字符或前一個(gè)子表達(dá)式m次

  • \{m,n\} : (m<n)表示匹配前一個(gè)字符或前一個(gè)字表達(dá)式最少m次,最多n次

  • \{m,\} : 表示匹配前一個(gè)字符或前一個(gè)子表達(dá)式至少m次

  • \{,n\} : 表示匹配前一個(gè)字符或前一個(gè)字表達(dá)式最多n次(匹配0次也算是成功)

  • *  表示前一個(gè)字符或前一個(gè)子表達(dá)式匹配0次或多次,等價(jià)于:{0,}

  • .*   匹配任意長度的任意字符

3.擴(kuò)展正則表達(dá)式的元字符

支持awk和egrep使用,如果grep和sed想要正常使用(grep -E  sed -r)

元字符作用含義
+匹配前面子表達(dá)式1次及以上
匹配前面子表達(dá)式0次或者1次
()將括號(hào)中的字符串作為一個(gè)整體
|以"或"的方式匹配字符串

3.1 擴(kuò)展常用的量詞

  • +  表示匹配前一個(gè)字符或前一個(gè)子表達(dá)式1或多次,即至少一次 等價(jià)于 {1, }
  • ?  表示匹配前一個(gè)字符或前一個(gè)子表達(dá)式0或1次,等價(jià)于 {0,1} 等價(jià)于 {,1}

3.2 分組捕獲和反向引用

使用小括號(hào)()包圍一部分正則表達(dá)式,這部分正則表達(dá)式即成為一個(gè)分組整體,也稱為一個(gè)子表達(dá)式。

分組后可以使用 \N 來反向引用對(duì)應(yīng)的分組匹配結(jié)果,N是1-9的正整數(shù),\1表示第一個(gè)分組表達(dá)式的匹配結(jié)果,\2表達(dá)第二個(gè)分組表達(dá)式的匹配結(jié)果。

注意:反向引用引用的是分組匹配后的結(jié)果,不是分組表達(dá)式

例如:正則表達(dá)式:(abc|def) and \1xyz 可以匹配字符串“abc and abcxyz ” 或“def and defxyz”,但是不能匹配“abc and defxyz” 或 “def and abcxyz”

二.grep 命令

1.命令簡介

grep 是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式,并把匹配的行打印出來

格式:

grep  [options]  pattern   [file]

options表示:選項(xiàng);    pattern 表示:匹配的的表達(dá)式;   file 表示:文件名

例如:grep  -i  "root" /etc/passwd

2.常用選項(xiàng)

-m  數(shù)字匹配到數(shù)字行停止
-v取反
-i忽略字符大小寫
-n顯示匹配的行號(hào)
-c統(tǒng)計(jì)匹配的行數(shù)
-o僅顯示匹配到的字符串
-q靜默模式,不輸出任何信息
-A  數(shù)字after  后數(shù)字行
-B  數(shù)字before    前數(shù)字行
-C  數(shù)字context   前后各數(shù)字行
-e實(shí)現(xiàn)多個(gè)選項(xiàng)間的邏輯 or 關(guān)系
-E使用ERE,相當(dāng)于egrep
-w匹配整個(gè)單詞
-F不支持正則表達(dá)式,相當(dāng)于fgrep
-f處理兩個(gè)文件相同內(nèi)容,把第一個(gè)文件作為匹配條件
-r遞歸目錄,但不處理軟連接   開始搜索目錄
-R遞歸目錄,但處理軟連接

操作:

-m

-i

-n

-c

-o

-q

-A  -B  -C

-e

-w

-E

擴(kuò)展正則中這些元字符可直接使用: ? 、 + 、 { 、 } 、 | 、 ( 和 ) 。

基礎(chǔ)正則中這些元字符前需要加反斜線轉(zhuǎn)義: \? 、 \+ 、 \{ 、 \} 、 \| 、 \( 和 \) 。

grep sed  默認(rèn)使用基礎(chǔ)正則表達(dá)式

grep -E 、 sed -r 、 egrep 、 awk 擴(kuò)展正則表達(dá)式

-r

3.操作

① 統(tǒng)計(jì)當(dāng)前主機(jī)的連接狀態(tài)

② 統(tǒng)計(jì)當(dāng)前連接主機(jī)數(shù)

③ 匹配QQ號(hào)

④ 匹配電話號(hào)碼

⑤  匹配郵箱

⑥ 統(tǒng)計(jì) /etc/fstab 下面有多少單詞

三.sed命令

1.關(guān)于sed

1.1 簡介

sed 是從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行,直到最后一行。每當(dāng)處理一行時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為模式空間(PatternSpace),接著用 sed 命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。一次處理一行的設(shè)計(jì)模式使得 sed 性能很高,sed 在讀取大文件時(shí)不會(huì)出現(xiàn)卡頓的現(xiàn)象。如果使用 vi 命令打開幾十M上百M(fèi)的文件,明顯會(huì)出現(xiàn)有卡頓的現(xiàn)象,這是因?yàn)?vi 命令打開文件是一次性將文件加載到內(nèi)存,然后再打開。sed 就避免了這種情況,一行一行的處理,打開速度非???,執(zhí)行速度也很快。

1.2 sed 編輯器的工作過程

sed 的工作流程主要包括讀取、執(zhí)行和顯示三個(gè)過程:

  • 讀?。?/strong> sed 從輸入流 (文件、管道、標(biāo)準(zhǔn)輸入) 中讀取一行內(nèi)容并存儲(chǔ)到臨時(shí)的緩沖區(qū)中(又稱模式空間,pattern space )。
  • 執(zhí)行: 默認(rèn)情況下,所有的 sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則 sed 命令將會(huì)在所有的行上依次執(zhí)行。
  • 顯示: 發(fā)送修改后的內(nèi)容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會(huì)被清空。在所有的文件內(nèi)容都被處理完成之前,上述過程將重復(fù)執(zhí)行, 直至所有內(nèi)容被處理完。

注意:默認(rèn)情況下所有的 sed 命令都是在模式空間內(nèi)執(zhí)行的,因此輸入的文件并不會(huì)發(fā)生任何變化,除非使用 "sed -i" 修改源文件、或使用重定向輸出到新的文件中。

1.3 瑪瑪哈哈

怎么解決 sed 命令處理容量過大,或內(nèi)容過多而導(dǎo)致執(zhí)行效率緩慢的問題?

方案一:

使用 split 命令進(jìn)行文件分割(如果文件是百萬行的,那么我們就創(chuàng)建一個(gè)單獨(dú)的目錄,將文件分割為一百個(gè)一萬行的文本),再使用 sed 命令進(jìn)行處理,除了使用 split 分割,也可以使用一個(gè)遍歷分割shell腳本進(jìn)行執(zhí)行。

方案二:

cat  文件名 | sed  處理    (這個(gè)方案只能針對(duì)中型的文件文本,如果文本量過大,處理效果不好)

2.sed 命令與選項(xiàng)操作符

1. 格式

sed [option]... 'script;script;...' [input  file...]
     選項(xiàng)         自身腳本語法         支持標(biāo)準(zhǔn)輸入管道

2.常用選項(xiàng)

-e

用指定命令或者腳本來處理輸入的文本文件

只有一個(gè)操作命令時(shí)省略,一般在執(zhí)行多個(gè)操作命令使用

-f用指定的腳本文件來處理輸入的文本文件
-n

不輸出模式空間內(nèi)容到屏幕,即不自動(dòng)打印

可以與 p 命令一起使用完成輸出

-r  -E使用擴(kuò)展正則表達(dá)式
-h顯示幫助
-i直接修改目標(biāo)文件
-i.xxx備份文件并原處編輯
-s將多個(gè)文件視為獨(dú)立文件,而不是單個(gè)連續(xù)的長文件流

3.操作符

“操作”用于指定文件對(duì)操作的動(dòng)作行為,也就是 sed 的命令。

通常情況下是采用的 “[n1[,n2]]” 操作參數(shù)的格式。n1、n2是可選的,代表選擇進(jìn)行操作的行數(shù),如操作需要在5~20行之間進(jìn)行,則表示為 “5,20 動(dòng)作行為” 

s替換,替換指定字符
d刪除,刪除選定的行
a增加,在當(dāng)前行下方增加一行指定內(nèi)容
i插入,在選定行上方插入一行指定內(nèi)容
c替換,將選定行替換為指定內(nèi)容
w保存模式匹配的行至指定文件
r讀取指定文件的文本至模式空間中匹配的行后
y字符轉(zhuǎn)換,轉(zhuǎn)換前后的字符長度必須相同
p打印行內(nèi)容。如果同時(shí)指定行,表示打印指定行;如果不指定行,則表示打印所有內(nèi)容;如果有非打印字符,則以ASCII碼輸出。其通常與"-n"選項(xiàng)一起使用
=打印行號(hào)
l(小寫L)打印數(shù)據(jù)流中的文本和不可打印的ASCII字符(如結(jié)束符$  制表符\t)

操作:

顯示第二行內(nèi)容

4.腳本格式

由 ‘地址+命令’ 組成

  • ① 不給地址  對(duì)全文進(jìn)行處理
  • ② 單地址  

  數(shù)字    指定的數(shù)字行

  $        最后一行

  • ③ 地址范圍

x,x    從第x行到第x行     3,6  從第3行到第6行

x,+x   從x行到+x行      3,+4   從3行到第7行

/pat1/,/pat2/     第一個(gè)正則表達(dá)式和第二個(gè)正則表達(dá)式之間的行

  • ④ 步進(jìn)  ~

1~2  奇數(shù)行

2~2  偶數(shù)行

n;打印下一行

操作:

小問題:

如何打印一段時(shí)間間的日志

5.搜索替代

s/pattern/string/修飾符 查找替換,支持使用其它分隔符,可以是其它形式:s@@@,s###

替換修飾符:
g 行內(nèi)全局替換
p 顯示替換成功的行
w   /PATH/FILE 將替換成功的行保存至文件中

& 指代之前找到的內(nèi)容

指代變量

分組替換

sed  -nr  's/正則匹配/\1/p'

還可以變換順序

操作:

取ip

② 

或者

提取版本號(hào)

提取0644

6.變量

修改端口

修改網(wǎng)卡名

總結(jié) 

到此這篇關(guān)于shell正則表達(dá)式、grep命令和sed命令舉例詳解的文章就介紹到這了,更多相關(guān)shell正則表達(dá)式grep命令和sed命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論