linux操作系統的一項重要的法則就是一切皆文件,然而對於初學者來說最頭疼的一件事就是linux龐大文件系統的管理,對於一些文本文件的查找所搜等無從下手,特別是對於習慣於windows操作系統的大家來說會覺得查找是一件麻煩事,今天我就來給大家分享一些linux中強大的文本搜索工具。
既然說到了文本搜索工具那就有必要說明一下它是什麼,在linux上這種文本搜索工具就是根據用戶指定的文本模式(搜索條件)對目標文件進行逐行搜索並且顯示匹配到的行。它的工作方式與windows不同,它只顯示匹配到搜索條件的那一行的信息,並不像windows那樣在全文中把搜索關鍵字做特殊標記。
當然了會有人說既然它不能顯示全文並且標註我要找的關鍵字那我幹嘛要用它,此工具就是爲了應對那些文件內容相當多並且需要快速找到你要的重要信息這種事件。而且此命令不管是管理員還是普通用戶都能使用,而且使用方法比較簡單。
既然說了那麼多它的好處那麼接下來就要介紹它的使用方法:
grep:全稱global search regular expression and print out the line
即全局搜索正則表達式並輸出到屏幕
語法格式爲:grep 【選項】.. “搜索條件” 文件..
例如:我要搜索在/etc/passwd下的所有包含root的行
[jsh@localhost ~]$ grep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [jsh@localhost ~]$
上述例子是不加選項用法
接下來給大家介紹grep的選項及用法:
【用法1】grep --color=auto “搜索條件” 文件
此選項是爲搜索條件上色
例如:我們把上述例子匹配到的root着色爲紅色
【用法2】grep -v “搜索條件” 文件
此選項是取反的意思,就是現實搜索條件以外的內容。
例如:還是搜索/etc/passwd下不包含bash的行
【用法3】grep -o “搜索條件” 文件
意爲僅顯示平匹配到的字串本身而非字串所在行
例如:只顯示/etc/passwd中的root字串本身而非其所在行
【用法4】grep -i “搜索條件” 文件
意爲不區分大小寫搜索
例如:我們查看一下/tmp/ABC.txt文件中a所在的行
【用法5】grep -A# “搜索條件” 文件(此處的#表示數字)
意爲搜索匹配字符的所在行以及後#行
【用法6】grep -B# “搜索條件” 文件(此處的#仍表示數字)
意爲搜索匹配字符的所在行以及前#行
例如:
【用法7】grep -C# “搜索條件” 文件
意爲搜索匹配字符的所在行以及前後#行
例如:
【用法8】grep -E “搜索條件” 文件 此命令相當於 egrep “搜索條件” 文件
意爲使用擴展正則表達式。詳細使用方法參照後文的擴展正則表達式。
既然說到了正則表達式那就必須要給大家分享一下了,grep和egrep都是支持基本正則表達式的,同時也支持擴展正則表達式。
什麼是正則表達式呢?
所謂正則表達式:就是一類字符所書寫的模式,其中的許多字符不表示其字面意義,而是表達控制或通配等功能。(即元字符)
元字符:不表示字面意義,用於功能性描述。
正則表達式的元字符分爲基本正則表達式元字符和擴展正則表達式元字符,這兩種元字符大體上相同用法也無大的差異。
基本正則表達式的元字符分爲:字符匹配元字符、次數匹配元字符、位置錨定元字符、分組元字符
字符匹配元字符:
. 意爲匹配任意單個字符
[] 匹配指定範圍內的任意單個字符 如:[0-9]表示0-9間的任意一個數字
[^]取反:匹配指定範圍之外的字符 如:[^0-9]表示0-9以外的任意一個字符
次數匹配元字符:用於實現指定其前面 的字符所能夠出現的次數
* 它前面的字符可以出現任意次 如:.*表示任意長度任意字符(也可以是一次都 未出現)
\? 表示前面的字符出現一次或零此(即可有可無) 如:x\?y所能匹配到的是xy、 y、ay
\{m\} 前面的字符出現m次 如:x\{2\}y所能匹配到的是xxy、xxxxyyy
\{m,n\}前面的字符至少出現m次且至多出現n次 如:x\{2,5\}y所能匹配到的是 xxxy、xxxxxyy
\{m,\}前面的字符至少出現m次,至多不限
\{0,n\}前面的字符至多出現n次
位置錨定元字符:
^ 行首錨定(字符必須出現在行首)
如:查看/etc/passwd下以“r”開頭中間隔兩個字符第三個字符 爲“t”的行
(值得注意的是grep的默認工作模式是貪婪模式,儘可能多的去匹配,如果把此實例稍作修改即可知曉,我們查看以"r"開頭中間跟任意長度任意字符然後再跟"t"的行:
我們可以看到顯示的第一行信息,匹配到root後並沒有結束而是繼續匹配root:x:0:0:root然後再去繼續尋找後邊有沒有“t”然後就又匹配到了root:x:0:0:root:/root。由此說明當匹配到第一個“t”後grep並沒有放棄,而是繼續尋找後邊有沒有“t”)
$行尾錨定
如:查看/etc/passwd下以shutdown結尾的行
^$空白行
\<詞首錨定(在linux中不包含特殊字符的連續字符組成的串叫單詞)
\>詞尾錨定
詞首詞尾錨定也可用\b單詞\b這種形式
如:查看/etc/passwd下以root這個單詞開頭的行
分組元字符:
\(組元素\)把括號內的組元素編排成一個組
分組元字符一般結合引用一起使用,使用格式如下:
\(組元素\) \#表示引用第#個括號內的內容(#表示數字)
注1:這裏的括號是有次序的,自左到右的左括號以及與其匹配的右括號,如下:
\(abc\(dasf\(sada\)\(sajgj\)\)\)\3表示引用自左到右的第三個左括號內的 內容,即引用\(sada\)內的內容
\(abc\(dasf\(sada\)\(sajgj\)\)\)\2表示引用自左到右第二個括號內的內 容,即引用\(dasf\(sada\)\(sajgj\)\)內的內容。
注2:分組中的模式匹配到的內容,可由正則表達式引擎記憶在內存中,之後可被引 用。
練習:
既然前邊講述了grep的用法和基本正則表達式,那麼我們就來做幾個練習題吧。
練習1:顯示/proc/meminfo文件中以大寫或小寫s開頭的行。
練習2:顯示/etc/passwd文件中默認shell爲/bin/bash的行。
練習3:找出/etc/passwd文件中的一位數或兩位數的數字。
練習4:找出/etc/passwd文件中不是以/bin/bash結尾的行。
經過上邊的練習相信大家一定會對grep有一個更深的瞭解,那麼接下就給大家分享一下擴展正則表達式的用法吧。
擴展正則表達式的字符有:字符匹配元字符、次數匹配元字符、位置錨定元字符、分組匹配元字符
字符匹配元字符與基本正則表達式一樣,這裏就不多做介紹了
次數匹配元字符:
*表示前邊字符出現任意次
?表示前邊字符可有可無
+表示前邊字符至少出現1次
{m}表示前邊字符必須出現m次
{m,n}表示前邊字符至少出現m次,至多出現n次
{m,}表示前邊字符至少出現m次,至多不限
{0,n}表示前邊字符至多出現n次
位置錨定元字符:
^行首錨定
$行尾錨定
\<或\b詞首錨定
\>或\b詞尾錨定
分組匹配元字符:
()
\#引用第#個括號內的內容
| 或者
如:conc|Cat表示conc或者Cat
con(c)|(C)at表示concat或者conCat
擴展正則表達式的使用:grep -E 或者egrep
練習5:找出ifconfig命令結果中的1-255之間的數字。
練習6:找出/etc/init.d/functions文件中某個單詞後跟一組括號“()”的行。
練習答案:(當然了此答案並不唯一,僅供參考)
1、
2、
3、
4、
5、
6、