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:
因爲只有行首跟行尾 (^$),所以,這樣就可以找出空白行啦!