grep egrep區(qū)別
成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋石涼亭等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身開發(fā)品質(zhì)網(wǎng)站。
grep 默認(rèn)不支持?jǐn)U展 但可以通過-E 選擇來支持?jǐn)U展正則
egrep 支持?jǐn)U展正則
關(guān)于正則與擴(kuò)展正則的區(qū)別可以看我另一篇shell 正則的介紹
文件處理順序 以行為單位,逐行進(jìn)行處理
默認(rèn)只輸出與表達(dá)式相匹配的文本行
基本用法
- 格式1:egrep [選擇] '正則表達(dá)式' 文件
- 格式2:前置命令 | egrep [選擇] '正則表達(dá)式'
? egrep命令工具 (擴(kuò)展正則命令)
? 常用命令選項(xiàng)
?grep 正則表達(dá)式,用來查找過濾文檔的工具符號(hào)
grep "root" user //在user文檔中查找有單詞root的行
grep "^root" user //在user文檔中查找以單詞root開頭的行
grep "bash " user //查找空行
grep "^ " user //查找以空格開頭的行
grep "[rot]" user //查找字母r或者o或者t
grep "roo[tn]" user //查找root或者roon
grep "[^rot]" user //查找字母r或者o或者t之外的內(nèi)容
grep "[a-z]" user //查找小寫字母
grep "[A-Z]" user //查找大寫字母
grep "[a-Z]" user //查找所有字母
grep "[0-9]" user //查找數(shù)字
grep "r..t" user //查找以r開頭t結(jié)尾中間有2個(gè)任意字符的單詞
grep "r. " user //查找以r開頭后面任意字符 相當(dāng)手通配符
grep "ro*" user //查找以r開頭后面有或沒有字母o的單詞,o可以出現(xiàn)任意次
grep "o{1,2}" user //查找o出現(xiàn)1次到2次的行
grep "o{2,3}" user //查找o出現(xiàn)2次到3次的行
grep "o{2}" user //查找o出現(xiàn)2次的行
grep "o{1,} " user //查找o出現(xiàn)1次以及1次以上
grep "(:0){2}" user //查找:0(數(shù)字零)連續(xù)出現(xiàn)2次的行
擴(kuò)展正則
egrep "o+" user //查找o出現(xiàn)1次以及1次以上
egrep "o?" user //查找o出現(xiàn)0次或1次
egrep "o{1,2}" user //查找o出現(xiàn)1次到2次的行
egrep "o{2,3}" user //查找o出現(xiàn)2次到3次的行
egrep "o{2}" user //查找o出現(xiàn)2次的行
egrep "o{1,}" user //查找o出現(xiàn)1次以及1次以上
egrep "(:0){2}" user //查找:0(數(shù)字零)連續(xù)出現(xiàn)2次的行
egrep "bash|nologin" user //查找bash或者nologin
egrep "\bthe\b" a //查找單詞the,前后是空格或者特殊符號(hào)
案例:
正則表達(dá)式匹配練習(xí)
1)典型的應(yīng)用場(chǎng)合:grep、egrep檢索文本行
grep命令不帶-E選項(xiàng)時(shí),支持基本正則匹配模式。比如“word”關(guān)鍵詞檢索、“^word”匹配以word開頭的行、“word$”匹配以word結(jié)尾的行……等等。
輸出以“r”開頭的用戶記錄:
輸出以“l(fā)ocalhost”結(jié)尾的行:
若希望在grep檢索式同時(shí)組合多個(gè)條件,比如輸出以“root”或者以“daemon”開頭的行:
而若若使用grep -E或egrep命令,可支持?jǐn)U展正則匹配模式,能夠自動(dòng)識(shí)別 |、{} 等擴(kuò)展正則表達(dá)式中的特殊字符,用起來更加方便,比如:
或者
使用grep -E 與 使用egrep命令完全等效,推薦使用后者,特別是涉及到復(fù)雜的正則表達(dá)式的時(shí)候。
2)grep、egrep命令的-q選項(xiàng)
選項(xiàng) -q 表示 quiet(靜默)的意思,結(jié)合此選項(xiàng)可以只做檢索而并不輸出,通常在腳本內(nèi)用來識(shí)別查找的目標(biāo)是否存在,通過返回狀態(tài) $? 來判斷,這樣可以忽略無關(guān)的文本信息,簡(jiǎn)化腳本輸出。
比如,檢查/etc/hosts文件內(nèi)是否存在192.168.4.4的映射記錄,如果存在則顯示“YES”,否則輸出“NO”,一般會(huì)執(zhí)行:
這樣grep的輸出信息和腳本判斷后的提示混雜在一起,用戶不易辨別,所以可以改成以下操作:
是不是清爽多了,從上述結(jié)果也可以看到,使用 -q 選項(xiàng)的效果與使用 /dev/null的效果類似。
3)基本元字符 ^、$ —— 匹配行首、行尾
輸出注釋的配置行(以#開頭的行):
統(tǒng)計(jì)本地用戶中登錄Shell為“/sbin/nologin”的用戶個(gè)數(shù):
提示: -m10僅在文件的前10行中過濾,后面的行不再過濾。
結(jié)合 -c 選項(xiàng)輸出匹配的行數(shù)
使用 -c 選項(xiàng)可輸出匹配行數(shù),這與通過管道再 wc -l的效果是相同的,但是寫法更簡(jiǎn)便。比如,統(tǒng)計(jì)使用“/bin/bash”作為登錄Shell的正常用戶個(gè)數(shù),可執(zhí)行:
或者
4)基本元字符 . —— 匹配任意單個(gè)字符
以/etc/rc.local文件為例,確認(rèn)文本內(nèi)容:
輸出/etc/rc.local文件內(nèi)的空行(用 –v 選項(xiàng)將條件取反):
5)基本元字符 +、?、 —— 目標(biāo)出現(xiàn)的次數(shù)*
還以/etc/rc.local文件為例:
輸出包括 f、ff、ff、……的行,即“f”至少出現(xiàn)一次:
輸出包括init、initial的行,即末尾的“ial”最多出現(xiàn)一次(可能沒有):
輸出包括stu、stuf、stuff、stufff、……的行,即末尾的“f”可出現(xiàn)任意多次,也可以沒有。重復(fù)目標(biāo)只有一個(gè)字符時(shí),可以不使用括號(hào):
輸出所有行,單獨(dú)的“.*”可匹配任意行(包括空行):
輸出/etc/passwd文件內(nèi)“r”開頭且以“nologin”結(jié)尾的用戶記錄,即中間可以是任意字符:
6)元字符 {} —— 限定出現(xiàn)的次數(shù)范圍
創(chuàng)建一個(gè)練習(xí)用的測(cè)試文件:
輸出包括ababab的行,即“ab”連續(xù)出現(xiàn)3次:
輸出包括abab、ababab、abababab的行,即“ab”連續(xù)出現(xiàn)2~4次:
輸出包括ababab、abababab、……的行,即“ab”最少連續(xù)出現(xiàn)3次:
7)元字符 [] —— 匹配范圍內(nèi)的單個(gè)字符
還以前面的測(cè)試文件bracet.txt為例:
輸出包括abc、abd的行,即前兩個(gè)字符為“ab”,第三個(gè)字符只要是c、d中的一個(gè)就符合條件:
輸出包括大寫字母的行,使用[A-Z]匹配連續(xù)范圍:
8)單詞邊界匹配
以文件/etc/rc.local為例:
輸出包括單詞“init”的行,文件中“initialization”不合要求:
或者:
輸出包括以“l(fā)l”結(jié)尾的單詞的行,使用 匹配單詞右邊界:
或者:
9)多個(gè)條件的組合
通過dmesg啟動(dòng)日志查看藍(lán)牙設(shè)備、網(wǎng)卡設(shè)備相關(guān)的信息:
對(duì)于Linux管理員來說,grep是日常最常用的命令,可以把匹配的字符輸出,同樣可以輸出顏色。
# grep --color 'test' /var/log/maillog
無聊練功:?用perl 實(shí)現(xiàn)grep --color
# vi colorgrep
#!/usr/bin/perl
use Term::ANSIColor;
my $test;
if (@ARGV != 2){
die "Please use (colorgrep 'some key word' filename)\n";
}
$test = shift @ARGV;
while(){
if(/$test/i){
print "$`";
print color "bold red";
print "$";
print color 'reset';
print "$'";
}
}
這里調(diào)用了Term::ANSIColor 函數(shù) color 有以下的參數(shù):
clear, reset, dark, bold, underline, underscore, blink, reverse, concealed, black, red, green, yellow, blue, magenta, cyan, white, on_black, on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, and on_white
還有以下的簡(jiǎn)化使用方法
2) use Term::ANSIColor qw(:constants);
如果使用這種方法,可以直接把顏色屬性放在要輸出的問題前面,從而簡(jiǎn)化輸出步驟。這些顏色屬性有:
CLEAR, RESET, BOLD, DARK, UNDERLINE, UNDERSCORE, BLINK, REVERSE, CONCEALED, BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, ON_BLACK, ON_RED, ON_GREEN, ON_YELLOW, ON_BLUE, ON_MAGENTA, ON_CYAN, and ON_WHITE
等。
例如:
print BOLD BLUE ON_WHITE “Text”, RESET, “\n”;
如果你打印完之后想清除掉字符串的格式,一定要記得在最后加上一個(gè)RESET的屬性值。
例如:
use Term::ANSIColor qw(:constants);
print BOLD, BLUE, “This text is in bold blue.\n”, RESET;
3) $Term::ANSIColor::AUTORESET = 1;
對(duì)于2)的方法,如果你不想在每條打印語句后面加上RESET的話,你可以直接把$Term::ANSIColor::AUTORESET的值設(shè)為true。這樣每次打印完字符,只要你的屬性值之間沒有逗號(hào),系統(tǒng)將自動(dòng)幫你清除掉顏色屬性。
看一個(gè)完整的例子:
use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
print BOLD BLUE “This text is in bold blue.\n”;
print “This text is normal.\n”;
這三種方法,使用起來各有千秋,可根據(jù)要打印的復(fù)雜程度選用。
source命令用法:source FileName
作用:在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令。
注:該命令通常用命令".”來替代。
使用范例:
1、source filename
2、. filename?#(中間有空格)?
source命令(從 C Shell 而來)是bash shell的內(nèi)置命令。點(diǎn)命令,就是個(gè)點(diǎn)符號(hào),(從Bourne Shell而來)是source的另一名稱。
同樣的,當(dāng)前腳本中配置的變量也將作為腳本的環(huán)境,source(或點(diǎn))命令通常用于重新執(zhí)行剛修改的初始化文檔,如 .bash_profile 和 .profile 等等。
例如,假如在登錄后對(duì) .bash_profile 中的 EDITER 和 TERM 變量做了修改,則能夠用source命令重新執(zhí)行 .bash_profile 中的命令而不用注銷并重新登錄。
比如在一個(gè)腳本里export $KKK=111?,假如用./a.sh執(zhí)行該腳本,執(zhí)行完畢后,運(yùn)行?echo $KKK,發(fā)現(xiàn)沒有值,假如用source來執(zhí)行 ,然后再echo,就會(huì)發(fā)現(xiàn)KKK=111。
因?yàn)檎{(diào)用./a.sh來執(zhí)行shell是在一個(gè)子shell里運(yùn)行的,所以執(zhí)行后,結(jié)構(gòu)并沒有反應(yīng)到父shell里,但是source不同他就是在本shell中執(zhí)行的,所以能夠看到結(jié)果。
source命令(從 C Shell 而來)是bash shell的內(nèi)置命令。點(diǎn)命令,就是一個(gè)點(diǎn)符號(hào),(從Bourne Shell而來)是source的另一名稱。
這兩個(gè)命令都以一個(gè)腳本為參數(shù),該腳本將作為當(dāng)前shell的環(huán)境執(zhí)行,即不會(huì)啟動(dòng)一個(gè)新的子進(jìn)程。所有在腳本中設(shè)置的變量將成為當(dāng)前Shell的一部分。
擴(kuò)展資料:
source命令的用法:
在編譯核心時(shí),常常要反復(fù)輸入一長(zhǎng)串命令,如:
這些命令既長(zhǎng),又繁瑣。而且有時(shí)候容易輸錯(cuò),浪費(fèi)你的時(shí)間和精力。如果把這些命令做成一個(gè)文件,讓它自動(dòng)按順序執(zhí)行,對(duì)于需要多次反復(fù)編譯核心的用戶來說,會(huì)很方便。
用source命令可以辦到這一點(diǎn)。它的作用就是把一個(gè)文件的內(nèi)容當(dāng)成是shell來執(zhí)行。
先在/usr/src/linux-2.4.20目錄下建立一個(gè)文件,取名為make_command,在其中輸入如下內(nèi)容:
文件建立好之后,以后每次編譯核心,只需要在/usr/src/linux-2.4.20下輸入source make_command?就行了。這個(gè)文件也完全可以做成腳本,只需稍加改動(dòng)即可。
shell編程中的命令有時(shí)和C語言是一樣的。表示與,||表示或。把兩個(gè)命令用聯(lián)接起來,如?make mrproper make menuconfig,表示要第一個(gè)命令執(zhí)行成功才能執(zhí)行第二個(gè)命令。
對(duì)執(zhí)行順序有要求的命令能保證一旦有錯(cuò)誤發(fā)生,下面的命令不會(huì)盲目地繼續(xù)執(zhí)行。