今天給大家聊一聊Linux中文本操作的三劍客:awk、grep、sed
,因其功能強(qiáng)大、使用頻繁,且是Linux下文本處理的得力利器,常被稱之為文本三劍客
。 grep
常用于查找,sed
常用于取行和替換,而awk
常用于運(yùn)算。
有句玩笑話常說:做Linux技術(shù)不識(shí)三劍客,玩遍L(zhǎng)inux也枉然
,雖然是玩笑語(yǔ),但也不得不說他們的重要性。
為什么聊起這個(gè)話題呢?
(資料圖片)
最近這幾天有點(diǎn)忙,可能是快到了畢業(yè)季了,最近來公司的面試的應(yīng)屆生突然多了起來。 在對(duì)應(yīng)屆生的面試過程中,往往會(huì)涉及一些基本的技術(shù)知識(shí),主要看重的是對(duì)基礎(chǔ)知識(shí)的掌握和對(duì)新知識(shí)的學(xué)習(xí)能力。 而Linux下常用的基本命令awk、grep、sed
也是常常被問及,來反映對(duì)Linux操作熟悉的程度。
問題:如何在Linux下查找包含某個(gè)函數(shù)的文件及所在的行?
熟悉Linux操作的肯定會(huì)說so easy! 此處先不給出具體答案,我們?cè)敿?xì)介紹一下三劍客
命令,如果不知道,看完后你肯定會(huì)知道答案!
grep全稱是Global Regular Expression Print
,表示全局正則表達(dá)式版本,它的使用權(quán)限是所有用戶。 它是Linux系統(tǒng)中一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來。
shell腳本中也經(jīng)常使用grep,因?yàn)間rep通過返回一個(gè)狀態(tài)值來說明搜索的結(jié)果。 如果搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。 我們利用這些返回值就可進(jìn)行一些自動(dòng)化的文本處理工作。
grep家族包括grep、egrep和fgrep。 egrep和fgrep的命令跟grep區(qū)別不大。 egrep是grep的擴(kuò)展,支持更多的re元字符,fgrep是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達(dá)式中的元字符表示其自身的字面意義。 linux使用GNU版本的grep。 它功能更強(qiáng),可以通過-G、-E、-F命令行選項(xiàng)來使用egrep和fgrep的功能。
格式:grep [option] pattern file
參數(shù)-a 不要忽略二進(jìn)制數(shù)據(jù)。-A <顯示行數(shù)> 除了顯示符合范本樣式的行之外,并顯示該行之后的指定幾行內(nèi)容。-B<顯示行數(shù)> 除了顯示符合范本樣式的行之外,并顯示該行之前的指定幾行內(nèi)容。-C<顯示行數(shù)> 除了顯示符合范本樣式的那一行之外,并顯示該行前后指定幾行的內(nèi)容。-b 在顯示符合范本樣式的那一行之外,并顯示字節(jié)偏移量。 -c 只計(jì)算顯示符合范本樣式的行數(shù),不顯示詳細(xì)內(nèi)容-d<進(jìn)行動(dòng)作> 當(dāng)指定要查找的是目錄而非文件時(shí),必須使用這項(xiàng)參數(shù),否則grep命令將回報(bào)信息并停止動(dòng)作。-e<范本樣式> 指定字符串作為查找文件內(nèi)容的范本樣式。-E 將范本樣式為延伸的普通表示法來使用,意味著能使用擴(kuò)展正則表達(dá)式。-f <范本文件> 指定范本文件,其內(nèi)容有一個(gè)或多個(gè)范本樣式,讓grep查找符合范本條件的文件內(nèi)容,格式為每一列的范本樣式。-F 將范本樣式視為固定字符串的列表。-G 將范本樣式視為普通的表示法來使用。-h 在顯示符合范本樣式的那一列之前,不標(biāo)示該列所屬的文件名稱。-H 在顯示符合范本樣式的那一列之前,標(biāo)示該列的文件名稱。-i 忽略字符大小寫的差別。-l 列出文件內(nèi)容符合指定的范本樣式的文件名稱。-L 列出文件內(nèi)容不符合指定的范本樣式的文件名稱。-n 在顯示符合范本樣式的那一列,標(biāo)示出該列的編號(hào)。-q 不顯示任何信息。-R/-r 此參數(shù)的效果和指定“-d recurse”參數(shù)相同,表明查找路徑為目錄-s 不顯示錯(cuò)誤信息。-v 反轉(zhuǎn)查找,顯示不符合模式的所有信息-w 只顯示全字符合的列。-x 只顯示全列符合的列。-y 此參數(shù)效果跟“-i”相同。-o 只輸出文件中匹配到的部分。--color=auto 把匹配部分標(biāo)記出來,要想當(dāng)前終端后續(xù)使用都要標(biāo)記匹配部分,可用alias命令重新封裝grep。示例:
正則表達(dá)式應(yīng)用廣泛,在絕大多數(shù)的編程語(yǔ)言都可以應(yīng)用,在Linux中,也有著很大的用處。 使用正則表達(dá)式,可以有效的篩選出需要的文本,然后結(jié)合相應(yīng)的支持的工具或語(yǔ)言,完成我們的需求。
格式
.匹配任意單個(gè)字符,不能匹配空行[] 匹配指定范圍內(nèi)的任意單個(gè)字符[^] 取反[:alnum:] 或 [0-9a-zA-Z][:alpha:] 或 [a-zA-Z][:上部:] 或 [A-Z][:lower:] 或 [a-z][:blank:] 空白字符(空格和制表符)[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴... )[:digit:] 十進(jìn)制數(shù)字 或[0-9][:xdigit:]十六進(jìn)制數(shù)字[:graph:] 可打印的非空白字符[:print:] 可打印字符[:punct:] 標(biāo)點(diǎn)符號(hào)匹配前面的字符任意次,包括0次,貪婪模式:盡可能長(zhǎng)的匹配.* 任意長(zhǎng)度的任意字符,不包括0次? 匹配其前面的字符0 或 1次匹配其前面的字符至少1次{n} 匹配前面的字符n次{m,n} 匹配前面的字符至少m 次,至多n次{,n} 匹配前面的字符至多n次{n,} 匹配前面的字符至少n次我們可以根據(jù)grep命令任意組合正則表達(dá)式
主要用來自動(dòng)編輯一個(gè)或多個(gè)文件, 簡(jiǎn)化對(duì)文件的反復(fù)操作
sed是一種流編輯器,一次處理一行內(nèi)容。 處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為“模式空間”,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容輸出。 然后讀入下行,執(zhí)行下一個(gè)循環(huán)。 如果沒有使諸如‘D’的特殊命令,那會(huì)在兩個(gè)循環(huán)之間清空模式空間,但不會(huì)清空保留空間。 這樣不斷重復(fù),直到文件末尾。 文件內(nèi)容并沒有改變,除非你使用重定向存儲(chǔ)輸出或-i。
格式:sed [options] "command" file(s) 常用參數(shù):
-n:不輸出內(nèi)容到屏幕,即不自動(dòng)打印,只打印匹配到的行-e:多點(diǎn)編輯,對(duì)每行處理時(shí),可以有多個(gè)Script-f:把Script寫到文件當(dāng)中,在執(zhí)行sed時(shí)-f指定文件路徑,如果是多個(gè)Script,換行寫-r:支持?jǐn)U展的正則表達(dá)式-i:直接將處理的結(jié)果寫入文件-i.bak:在將處理的結(jié)果寫入文件之前備份一份示例:
sed "=" test.txt #顯示行號(hào)sed "3=" test.txt #顯示第三行行號(hào)sed "/./=" test.txt #只顯示非空白行的行號(hào)sed -n "/./!=" test.txt #只顯示空白行行號(hào)sed "$=" test.txt #顯示總共有多少行sed -n "2p" test.txt #要加-n,否則會(huì)默認(rèn)自動(dòng)打印所有內(nèi)容sed -n "2 p" test.txt #要加-n,否則會(huì)默認(rèn)自動(dòng)打印所有內(nèi)容# 輸出指定行sed -n "2,7 p" test.txt sed -n "2,7p" test.txtsed -n "2,7 {p}" test.txt#替換文件中內(nèi)容sed -i "s/bck/sh/" test.txt test1.txt #替換test.txt、test1.txt內(nèi)的bck為sh,每行只替換一個(gè)sed -i "s/bck/sh/g" test.txt #替換test.txt內(nèi)的bck為sh,每行都進(jìn)行全面替換sed -i "s/bck/sh/3g" test.txt #替換test.txt內(nèi)的bck為sh,從第3個(gè)匹配位置開始替換sed -i "s@bck@sh@g" test.txt #替換test.txt內(nèi)的bck為sh,每行都進(jìn)行全面替換sed -i "s#bck#sh#g" test.txt #替換test.txt內(nèi)的bck為sh,每行都進(jìn)行全面替換#顯示查找內(nèi)容的行sed -n "/sh/p" test.txt #顯示test.txt內(nèi)的所有包含sh的所有行sed -n "/sh/ ,$ p" test.txt #顯示test.txt里第一條包含sh的行及以下到末尾的所有行
awk用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。 數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdin)、一個(gè)或多個(gè)文件,或其它命令的輸出。 它支持用戶自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式,是linux/unix下的一個(gè)強(qiáng)大編程工具。 它在命令行中使用,但更多是作為腳本來使用。 awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語(yǔ)言的相同之處,靈活性是awk最大的優(yōu)勢(shì)。 awk其實(shí)不僅僅是工具軟件,還是一種編程語(yǔ)言。
格式:awk [選項(xiàng)] "program" var=value file...awk [選項(xiàng)] -f 程序文件 var=value file...awk [options] "BEGIN{ action;... } pattern{ action;... }END{ action;... }" 文件 ...
常用命令選項(xiàng)
-F fs:fs指定輸入分隔符,fs可以是字符串或正則表達(dá)式,如-F:-v var=value:賦值一個(gè)用戶定義變量,將外部變量傳遞給awk-f scripfile:從腳本文件中讀取awk命令示例:
awk -v FS=":" "{print $1,$2}" testawk #FS指定輸入分隔符awk -v FS=":" -v OFS="---" "{print $1,$2}" testawk #OFS指定輸出分隔符awk -v RS=":" "{print $1,$2}" testawkawk -v FS=":" -v ORS="---" "{print $1,$2}" testawkawk -F: "{print NF}" testawkawk -F: "{print $(NF-1)}" testawk #顯示倒數(shù)第2列
上述三個(gè)命令的功能及參數(shù)遠(yuǎn)遠(yuǎn)不止本文提到的這些,在此只是羅列了一些常用的功能及參數(shù)。 這三個(gè)命令的功能非常強(qiáng)大,用法及參數(shù)和功能也非常的多,我們沒必要刻意去記憶,也不可能全部記住,記住一些常用的參數(shù)及用法即可。 只要當(dāng)我們有需求時(shí)知道用哪個(gè)命令然后對(duì)應(yīng)的去查找相關(guān)參數(shù)用法即可。
標(biāo)簽: