linux grep命令總結

linux grep命令總結

簡介

grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。

grep常用用法

[root@www ~]# grep [-acinv] [--color=auto] '搜尋字符串' filename

選項與參數:

-a :將 binary 文件以 text 文件的方式搜尋數據

-c :計算找到 '搜尋字符串' 的次數

-i :忽略大小寫的不同,所以大小寫視爲相同

-n :順便輸出行號

-s 不顯示錯誤信息
-E 使用擴展正則表達式

-v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內容的那一行!

--color=auto :可以將找到的關鍵詞部分加上顏色的顯示喔!

pattern正則表達式主要參數:
\: 忽略正則表達式中特殊字符的原有含義。
^:匹配正則表達式的開始行。
$: 匹配正則表達式的結束行。
\<:從匹配正則表達 式的行開始。
\>:到匹配正則表達式的行結束。
[ ]:單個字符,如[A]即A符合要求 。
[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的單個字符。
* :有字符,長度可以爲0。

\< 和 \> 分別標註單詞的開始與結尾。
例如:
grep man * 會匹配 ‘Batman’、’manic’、’man’等,
grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其他的字符串。

將/etc/passwd,有出現 root 的行取出來

# grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

# cat /etc/passwd | grep root 

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

可以使用國際模式匹配的類名:

[[:upper:]]   [A-Z]
[[:lower:]]   [a-z]
[[:digit:]]   [0-9]
[[:alnum:]]   [0-9a-zA-Z]
[[:space:]]   空格或tab
[[:alpha:]]   [a-zA-Z]


grep正則表達式元字符集(基本集)

^  錨定行的開始 如:'^grep'匹配所有以grep開頭的行。

$  錨定行的結束 如:'grep$'匹配所有以grep結尾的行。

.   匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,然後是p。

*  匹配零個或多個先前字符 如:' *grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任意字符

[] 匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。

[^]  匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。

\(..\)  標記匹配字符,如:'\(love\)',love被標記爲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的反置形式,匹配一個非單詞字符,如點號句號等。\W*則可匹配多個。

\b  單詞鎖定符,如: '\bgrep\b'只匹配grep,即只能是grep這個單詞,兩邊均爲空格。

find與xargs

find . -type f -print | xargs file 查找系統中的每一個普通文件,然後使用xargs命令來測試它們分別屬於哪類文件

find / -name "core" -print | xargs echo "" >/tmp/core.log 在整個系統中查找內存信息轉儲文件(core dump) ,然後把結果保存到/tmp/core.log 文件中:

find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname這個詞

find ./ -mtime +3 -print|xargs rm -f –r 刪除3天以前的所有東西 (find . -ctime +3 -exec rm -rf {} \;)

find ./ -size 0 | xargs rm -f & 刪除文件大小爲零的文件

find命令配合使用exec和xargs可以使用戶對所匹配到的文件執行幾乎所有的命令。

find命令的常用選項及實例

-name

按照文件名查找文件。 
find /dir -name filename  在/dir目錄及其子目錄下面查找名字爲filename的文件 
find . -name "*.c" 在當前目錄及其子目錄(用“.”表示)中查找任何擴展名爲“c”的文件

-perm 
按照文件權限來查找文件。 
find . -perm 755 –print 在當前目錄下查找文件權限位爲755的文件,即文件屬主可以讀、寫、執行,其他用戶可以讀、執行的文件

-prune 
使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。 
find /apps -path "/apps/bin" -prune -o –print 在/apps目錄下查找文件,但不希望在/apps/bin目錄下查找 
find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam目錄下查找不在dir1子目錄之內的所有文件

-user 
按照文件屬主來查找文件。 
find ~ -user sam –print 在$HOME目錄中查找文件屬主爲sam的文件

-group 
按照文件所屬的組來查找文件。 
find /apps -group gem –print 在/apps目錄下查找屬於gem用戶組的文件 

-mtime -n +n 
按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前。 
find / -mtime -5 –print 在系統根目錄下查找更改時間在5日以內的文件 
find /var/adm -mtime +3 –print 在/var/adm目錄下查找更改時間在3日以前的文件

-nogroup 
查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。 
find / –nogroup -print

-nouser 
查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。 
find /home -nouser –print

-newer file1 ! file2 
查找更改時間比文件file1新但比文件file2舊的文件。

-type 
查找某一類型的文件,諸如: 
b - 塊設備文件。 
d - 目錄。 
c - 字符設備文件。 
p - 管道文件。 
l - 符號鏈接文件。 
f - 普通文件。 
find /etc -type d –print 在/etc目錄下查找所有的目錄 
find . ! -type d –print 在當前目錄下查找除目錄以外的所有類型的文件 
find /etc -type l –print 在/etc目錄下查找所有的符號鏈接文件

-size n:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。 
find . -size +1000000c –print 在當前目錄下查找文件長度大於1 M字節的文件 
find /home/apache -size 100c –print 在/home/apache目錄下查找文件長度恰好爲100字節的文件 
find . -size +10 –print 在當前目錄下查找長度超過10塊的文件(一塊等於512字節)

-depth:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。 
find / -name "CON.FILE" -depth –print 它將首先匹配所有的文件然後再進入子目錄中查找 

-mount:在查找文件時不跨越文件系統mount點。  
find . -name "*.XC" -mount –print 從當前目錄開始查找位於本文件系統中文件名以XC結尾的文件(不進入其他文件系統)

-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。

將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號

# grep -n root /etc/passwd
3:root:x:0:0:root:/root:/bin/bash
5:operator:x:11:0:operator:/root:/sbin/nologin

grep 可以使用 --color=auto 來將關鍵字部分使用顏色顯示。你可以在 ~/.bashrc 內加上這行:『alias grep='grep --color=auto'』再以『 source ~/.bashrc 』來立即生效。

將/etc/passwd,將root行過濾掉,不出現帶有root字符的行。

[root@www script]# grep -v root /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
將帶有root的字符已經過濾掉了。

將/etc/passwd中,過濾掉root 和nologin,不出現帶有root 和nologin字符的行。

[root@www script]# grep -v root /etc/passwd|grep -v nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
將帶有root 和nologin的字已經過濾掉了。

根據文件內容遞歸查找目錄

# grep ‘mysql’ *           #在當前目錄搜索帶'energywise'行的文件

# grep -r ‘mysql’ *        #在當前目錄及其子目錄下搜索'energywise'行的文件
# grep -l -r ‘mysql’ *     #在當前目錄及其子目錄下搜索'energywise'行的文件,但是不顯示匹配的行,只顯示匹配的文件

grep與正規表達式

[root@www script]# grep "google\>" regular.txt 

.google is the best tools for search keyword.

[root@www script]# grep "\<google" regular.txt  

.google is the best tools for search keyword.

[root@www script]# grep "\<goog" regular.txt   

.google is the best tools for search keyword.

[root@www script]# grep "\<goo" regular.txt              模糊匹配關鍵字

Oh! The soup taste good.

.google is the best tools for search keyword.

gooogle yes!

[root@www script]# grep "goo\>" regular.txt              沒有匹配到關鍵字

[root@www script]# grep "google\>" regular.txt 

.google is the best tools for search keyword.

[root@www script]# grep "\<google\>" regular.txt      精確匹配關鍵字

.google is the best tools for search keyword.

[root@www script]# grep "\<google" regular.txt         精確匹配關鍵字

.google is the best tools for search keyword.

[root@www script]# grep "google" regular.txt             精確匹配關鍵字

.google is the best tools for search keyword.

[root@www script]# grep "\<[Gg]oogle" regular.txt   

google is the best tools for search keyword.

Google is the best tools for search keyword.


字符類

字符類的搜索:如果我想要搜尋 test 或 taste 這兩個單字時,可以發現到,其實她們有共通的 't?st' 存在~這個時候,我可以這樣來搜尋:

[root@www ~]# grep -n 't[ae]st' regular.txt 

5:I can't finish the test.

7:Oh! The soup taste good.

字符類的反向選擇 [^] :如果想要搜索到有 oo 的行,但不想要 oo 前面有 g,如下

[root@www ~]# grep -n '[^g]oo' regular.txt 

2:apple is my favorite food.

3:Football game is not use feet only.

9:google is the best tools for search keyword.

11:goooooogle yes!

第 2,3 行沒有疑問,因爲 foo 與 Foo 均可被接受,但是第 9 行明明有 google 的 goo 啊,別忘記了,因爲該行後面出現了 tool 的 too 啊!所以該行也被列出來,也就是說, 9 行裏面雖然出現了我們所不要的項目 (goo) 但是由於有需要的項目 (too) , 因此是符合字串搜尋的。

至於第 11 行,同樣的,因爲 goooooogle 裏面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所以,這一行也是符合需求的。

假設我 oo 前面不想要有小寫字母,所以我可以這樣寫 [^abcd....z]oo,但是這樣並不方便,由於小寫字母的 ASCII 上編碼的順序是連續的, 因此,我們可以這樣來寫:

[root@www ~]# grep -n '[^a-z]oo' regular.txt 

3:Football game is not use feet only.

如果該字節組是連續的,例如大寫英文/小寫英文/數字等等, 就可以使用[a-z],[A-Z],[0-9]等方式來書寫,那麼如果我們的要求字串是數字與英文呢? 就將他全部寫在一起,變成:[a-zA-Z0-9]。

我們要取得有數字的那一行,就這樣:

[root@www ~]# grep -n '[0-9]' regular.txt 
5:However, this dress is about $ 3183 dollars.
8:You are the best is mean you are the no. 1.

行首與行尾字節 ^ $
行首字符:如果我想要讓 the 只在行首列出呢? 這個時候就得要使用定位字節了!我們可以這樣做:

[root@www ~]# grep -n '^the' regular_express.txt
12:the symbol '*' is represented as start.

如果我不想要開頭是英文字母,則可以是這樣:

[root@www ~]# grep -n '^[^a-zA-Z]' regular.txt
1:"Open Source" is a good mechanism to develop programs.
11:# I am VBird

注意:因爲小數點具有其他意義,所以必須要使用轉義字符(\)來加以解除其特殊意義!

找出空白行:

[root@www ~]# grep -n '^$' regular_express.txt
5:

因爲只有行首跟行尾 (^$),所以,這樣就可以找出空白行啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章