1. 程式人生 > >Linux每天一個命令:grep

Linux每天一個命令:grep

軟件版本 color res cat findstr 雙引號 filename 進制數 同時

grep (縮寫來自Globally search a Regular Expression and Print)

是一種強大的文本搜索工具,它能使用特定模式匹配(包括正則表達式)搜索文本,並默認輸出匹配行。Unix的grep家族包括grep、egrep和fgrep。Windows系統下類似命令FINDSTR。

基本簡介

egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的擴展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。 grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕或指定文件(重定向),不影響原文件內容。 grep可用於shell腳本,因為grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2
。我們利用這些返回值就可進行一些自動化的文本處理工作。 Grep命令中允許指定的串語句是一個規則表達式,這是一種允許使用某些特殊鍵盤字符的指定字符串的方法,這種方法中的特殊鍵盤字符可以用於代表其他字符也可以進一步定義模式匹配工作方式。例如:grep ".*hood" grep.txt.txt。該命令將在文件grep.txt中搜索,顯示出包含帶有字符串hood的字的每一行。命令行中的點表示的是hood之前可以有任意字符,星號指的是在字符串之前點號所表示的任意字符可以有任意個(其中的雙引號是可有可無的,但是當語句中包含短語或者空格時就必須加雙引號)。

表達符集

匹配文本
[root@localhost ~]# cat grep.txt linuxhood linxuhood shell linux hoodpython python is good shell is good
^ 錨定行的開始 如:‘^grep‘匹配所有以grep開頭的行。
[root@localhost ~]# grep ^python grep.txt 
python is good
$ 錨定行的結束 如:‘grep$‘匹配所有以grep結尾的行。
[root@localhost ~]# grep good$ grep.txt 
python is good
shell is good
. 匹配一個非換行符(‘\n‘)的字符如:‘gr.p‘匹配gr後接一個任意字符,然後是p。
[root@localhost ~]# grep go.d grep.txt 
python is good
shell is good
* 匹配零個或多個先前字符 如:‘ *grep‘ (註意*前有空格)匹配所有零個或多個空格後緊跟grep的行,需要用egrep 或者grep帶上 -E 選項。 .*一起用代表任意字符。 [] 匹配一個指定範圍內的字符,如‘[Gg]rep‘匹配Grep和grep。 [^] 匹配一個不在指定範圍內的字符,如:‘[^A-FH-Z]rep‘匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。 \(..\) 標記匹配字符,如‘\(love\)‘,love被標記為1;通過\1引用。 \< 錨定單詞的開始,如:‘\<grep‘匹配包含以grep開頭的單詞的行。 \> 錨定單詞的結束,如‘grep\>‘匹配包含以grep結尾的單詞的行。 x\{m\} 重復字符x,m次,如:‘o\{5\}‘匹配包含5個o的行。 x\{m,\} 重復字符x,至少m次,如:‘o\{5,\}‘匹配至少有5個o的行。 x\{m,n\} 重復字符x,至少m次,不多於n次,如:‘o\{5,10\}‘匹配5--10個o的行。 \w 匹配文字和數字字符,也就是[A-Za-z0-9],如:‘G\w*p‘匹配以G後跟零個或多個文字或數字字符,然後是p。 \W \w的反置形式,匹配一個或多個非單詞字符,如點號句號等。 \b 單詞鎖定符,如: ‘\bgrep\b‘只匹配grep。 用於egrep和 grep -E的元字符擴展集 \+ 匹配一個或多個先前的字符。如:‘[a-z]\+able‘,匹配一個或多個小寫字母後跟able的串,如loveable,enable,disable等。 \? 匹配零個或一個先前的字符。如:‘gr\?p‘匹配gr後跟一個或沒有字符,然後是p的行。 a\|b\|c 匹配a或b或c。如:grep|sed匹配grep或sed

POSIX字符類

為了在不同國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符類,如[:alnum:]是A-Za-z0-9的另一個寫法。要把它們放到[]號內才能成為正則表達式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符類。 [:alnum:] 文字數字字符 [:alpha:] 文字字符 [:digit:] 數字字符 [:graph:] 非空字符(非空格、控制字符) [:lower:] 小寫字符 [:cntrl:] 控制字符 [:print:] 非空字符(包括空格) [:punct:] 標點符號 [:space:] 所有空白字符(新行,空格,制表符) [:upper:] 大寫字符 [:xdigit:] 十六進制數字(0-9,a-f,A-F)

命令選項:

-number   同時顯示匹配行上下的number行,如:grep -2 pattern filename同時顯示匹配行的上下2行。 -a, --text   用於匹配二進制數據 -b,--byte-offset   在顯示符合樣式的那一行之前,標示出該行第一個字符的編號。 -c,--count   只打印匹配的行數,不顯示匹配的內容。 -f File,--file=File   指定規則文件,其內容含有一個或多個規則樣式,讓grep查找符合規則條件的文件內容,格式為每行一個規則樣式 -h,--no-filename   當搜索多個文件時,不顯示匹配文件名前綴。 -i,--ignore-case   忽略大小寫差別。 -o, --only-matching   只顯示正則表達式匹配的部分。(show only the part of a line matching PATTERN) -q,--quiet   取消顯示,只返回退出狀態。0則表示找到了匹配的行。 -l,--files-with-matches   打印匹配模板的文件清單。 -L,--files-without-match   打印不匹配模板的文件清單。 -n,--line-number   在匹配的行前面打印行號。 -s,--silent   不顯示關於不存在或者無法讀取文件的錯誤信息。 -v,--revert-match   反檢索,只顯示不匹配的行。 -w,--word-regexp   如果被\<和\>引用,就把表達式做為一個單詞搜索。 -R, -r, --recursive   遞歸的讀取目錄下的所有文件,包括子目錄。 比如grep -R ‘pattern‘ test會在 test 及其子目錄下的所有文件中,匹配 pattern。 -V,--version   顯示軟件版本信息。 -A6   查找某些字符的內容,並下延伸6行 -B6   查找某些字符的內容,並上延伸6行 -C1   查找某些字符的內容,並上和向下各延伸1行   這幾行後面的數字直接影響延伸數量,並以--符號分割搜索行的結果

實例:

實例1:查找指定進程

[root@localhost ~]# ps -ef| grep sshd | grep -v grep‘     #-v去掉grep本身執行進程
root      2108     1  0 Oct31 ?        00:00:00 /usr/sbin/sshd -D
root      6544  2108  0 03:50 ?        00:00:00 sshd: root@pts/4
root     14208  2108  0 Nov29 ?        00:00:04 sshd: root@pts/2
root     26721  2108  0 Nov30 ?        00:00:00 sshd: root@pts/3

實例2:查找指定進程個數

[root@localhost ~]# ps -ef| grep sshd | grep -v grep -c
4

實例3:從文件中讀取關鍵詞進行搜索

[root@localhost ~]# cat test.txt 
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost ~]# cat rege.txt 
l.*x
Redhat
[root@localhost ~]# cat test.txt | grep -f rege.txt 
hnlinux
ubuntu linux
Redhat
linuxmint

說明:

  輸出test.txt文件中含有從rege.txt文件中讀取出的關鍵詞的內容行

實例3:從文件中查找關鍵詞

[root@localhost ~]# cat test.txt 
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost ~]# grep l.*x test.txt 
hnlinux
ubuntu linux
linuxmint
[root@localhost ~]# grep -n l.*x test.txt 
1:hnlinux
4:ubuntu linux
7:linuxmint

實例4:從多個文件查找關鍵詞

[root@localhost ~]# cat test.txt 
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost ~]# cat test1.txt 
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost ~]# grep -n l.*x test.txt test1.txt 
test.txt:1:hnlinux
test.txt:4:ubuntu linux
test.txt:7:linuxmint
test1.txt:1:hnlinux
test1.txt:4:ubuntu linux
test1.txt:7:linuxmint

實例5:顯示當前目錄下以.txt 結尾的文件中的所有包含每個字符串至少有7個連續小寫字符的字符串的行

[root@localhost ~]# grep -nE [a-z]{7,} *.txt
grep.txt:1:linuxhood
grep.txt:2:linxuhood shell 
grep.txt:3:linux hoodpython
gtest.txt:1:loversrs
gtest.txt:6:mariadb
gtest.txt:9:loverss
no_rege.txt:1:loverss
test1.txt:1:hnlinux
test1.txt:2:peida.cnblogs.com
test1.txt:7:linuxmint
test.txt:1:hnlinux
test.txt:2:peida.cnblogs.com
test.txt:7:linuxmint

  

Linux每天一個命令:grep