grep "關鍵字" file文件名 | tail -100|grep "關鍵字" --col
grep的功能
grep從一個或多個文本文件中查找符合指定范本(正則表達式)的行,並把查找結果輸出到指定設備(默認到屏幕)。
語法:
/usr/bin/grep [選項] <范本(正則表達式)> [文件1 ...]
范本是一個單獨的詞或者是一個用引號括起來的字符串。如果范本包含空格,則范本要用引號括起來。grep默認下把結果輸出到屏幕但是並不影響或改變任何被查找的目標文件。
一些特殊字符($, *, [, ^, |, (, ), 和/)的使用要特別小心,因為這些字符在shell里有特殊意義。如果這些字符作為范本的一部份,請用單引號把整個范式括起來。
范本是一個單獨的詞或者是一個用引號括起來的字符串。如果范本包含空格,則范本要用引號括起來。grep默認下把結果輸出到屏幕但是並不影響或改變任何被查找的目標文件。
一些特殊字符($, *, [, ^, |, (, ), 和/)的使用要特別小心,因為這些字符在shell里有特殊意義。如果這些字符作為范本的一部份,請用單引號把整個范式括起來。
# grep root /etc/passwd /etc/shadow /etc/passwd:root:x:0:0:Super-User:/:/sbin/sh /etc/shadow:root:PdhpgiTZvqa2:13732:::::: 備注:黑體部分是文件名 |
grep命令的輸入
grep有三種輸入來源:標准輸入(鍵盤)、管道和文件。如果你忘了輸入目標文件,grep會假定從標准輸入設備(鍵盤)取得輸入,直到你按^D(Control+D)。如果是管道,上個命令的輸出將被作為grep的輸入被處理,並把查找結果輸出到指定輸出設備。
global$grep mypattern hello grep I forget input file(s) ^D global$ global$ ps -ef | grep root global$ grep root /etc/passwd /etc/shadow |
grep命令的返回值(不是查找結果)
### 0 (范本在指定文件里被查找到。) global$grep root /etc/passwd;echo $? root:x:0:0:Super-User:/:/sbin/sh 0 ### 1 (范本在指定文件里沒有查找到) global$grep roo1t /etc/passwd;echo $? 1 ### 2 (指定的目標文件不存在) global$grep root /etc/passwd1;echo $? grep: can't open /etc/passwd1 2 備注:Bourn/Korn shell變量,?,返回最后被執行的命令的返回值;C shell變量是status。 |
grep命令的選項
選項 | 描述 |
-c | 顯示符合范本的行的數目而不是顯示滿足條件的行的內容 |
-h | 不顯示文件名 |
-i | 忽略大小寫 |
-l | 只列出有滿足條件的行的文件的文件名 |
-n | 顯示滿足條件的行在包含它的文件中的行號 |
-s | 隱形操作,即如果出錯不輸出任何信息。在用於只檢返回值時非常有用。 |
-v | 反向顯示,即輸出不滿足條件的行。 |
grep的正則表達式的元字符
元字符 | 功能 | 列子 | 描述 |
^ | 行首 | '^love' | 匹配所有以love開始的行 |
$ | 行尾 | 'love$' | 匹配所有以love結尾的行 |
.(點) | 匹配任意一個字符 | 'l..e' | 匹配所有包含l,緊跟任意2個字符,再跟一個e的行 |
* | 匹配0個或多個字符 | ' *love' | 匹配所有包含0個或多個空格,再跟love的行 |
[] | 匹配一個在集合里的字符 | '[Ll]ove' | 匹配包含Love或love的行 |
[^] | 匹配一個不在集合里的字符 | '[^A-K]ove' | 匹配不包含從A-K的字符,緊跟ove的行 |
/< | 詞首 | '/<love' | 匹配所有有任一單詞以love為首的行 |
/> | 詞尾 | 'love/>' | 匹配所有有任一單詞以love為尾的行 |
/(../) | 標識匹配的一個或多個字符 | '/(love/)ing' | 標識一個標注以期后面引用,第一個用/1,一次類推,最多有9個;見列子 |
x/{m/} x/{m,/} x/{m,n/} |
重復字符x:m次 至少m次 在m次到n次之間 |
'0/{5/}' '0/{5,/}' '0/{5,10/} |
如果一個行有:連續5個0,至少連續5個0,連續的0在5到10之間,則滿足要求。 |
例子
- 查找在/etc下以p為首的文件中有那些行包含有root
# 、/usr/bin/grep root /etc/p* /etc/passwd:root:x:0:0:Super-User:/:/sbin/sh /etc/project:user.root:1:::: |
- 輸出所有的非空行
$ /usr/bin/grep . $HOME.profile $ /usr/bin/grep ^$ /etc/passwd | wc -l (本命令統計/etc/passwd里有幾行空行) |
- 輸出/etc/passwd中包含root或者sys的行
$/usr/xpg4/bin/grep -e 'root' -e 'sys' /etc/passwd 或者 $/usr/xpg4/bin/grep -E 'root|sys' /etc/passwd root:x:0:0:Super-User:/:/sbin/sh sys:x:3:3::/: |
- 輸出所有行,此行包含這樣的一個單詞,它以小寫字母打頭,緊跟任意個字符,以n結尾
$ grep '/<[a-z].*n/>' /etc/passwd (注意.*,它表示任意個字符,包括空格) |
- 輸出行,它包含一個3,緊跟着一個點和一個數字,再緊跟任意個字符(.*),再跟一個3(前面標識過了),一個或多個TAB,再跟一個3. 因為3前面被標識過,/(3/),所以后面引用只要用/1就可以了。
$ grep '/(3/)/.[0-9].*/1 */1' /etc/passwd 注:你可以替換3為任意你想要的其他字符 |
- 輸出行,這些行有單詞至少包含9個連續的小寫字母
$grep '[a-z]/{9,/}' /etc/passwd |
- 輸出當前目錄下文件名,這些文件包含有這樣子的行,這些行包含有'SE'字符串,忽略大小寫。
$ grep -l -i 'se' * |
egrep(擴展的grep)
元字符 | 功能 | 例子 | 描述 |
+ | 匹配一個或多個前導字符 | '[a-z]+ove' | 匹配一個或多個小寫字符,緊跟ove.如love,loove,alove |
? | 匹配0個或一個前導字符 | 'lo?ve' | 匹配以l開始,緊跟零個o或者一個o,在跟ve.如lve,love |
a|b | 匹配a或者b | 'love|hate' | 匹配love或者hate |
() | 分組 | 'lov(able|ly)?' | 匹配lovable或者lovly,或者lov |
- 包含S,緊跟h或者u
$ egrep 'S(h|u)' /etc/passwd |