1. 程式人生 > >grep的語法和用法

grep的語法和用法

$ ls -l | grep '^a'通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。$ grep 'test' d*顯示所有以d開頭的檔案中包含test的行。$ grep 'test' aa bb cc顯示在aa,bb,cc檔案中匹配test的行。$ grep '[a-z]\{5\}' aa顯示所有包含每個字串至少有5個連續小寫字元的字串的行。$ grep 'w\(es\)t.*\1' aa如果west被匹配,則es就被儲存到記憶體中,並標記為1,然後搜尋任意個字元(.*),這些字元後面緊跟著另外一個es(\1),找到就顯示該行。如果用egrep或grep -E,就不用"\"號進行轉義,直接寫成'w(es)t.*\1'就可以了。

下面的例子中我們假定在檔案phone.txt中包含以下的文字,——其格式是姓加一個逗號,然後是名,然後是一個製表符,然後是電話號碼:

Francis, John           5-3871
Wong, Fred              4-4123 
Jones, Thomas           1-4122 
Salazar, Richard        5-2522

grep命令 描述
grep '\t5-...1' phone.txt 把所有電話號碼以5開頭以1結束的行打印出來,注意製表符是用\t表示的
grep '^S[^ ]* R' phone.txt 列印所有姓以S打頭和名以R打頭的行
grep '^[JW]' phone.txt 列印所有姓開頭是J或者W的行
grep ', ....\t' phone.txt 列印所有姓是4個字元的行,注意製表符是用\t表示的
grep -v '^[JW]' phone.txt 列印所有不以J或者W開頭的行
grep '^[M-Z]' phone.txt 列印所有姓的開頭是M到Z之間任一字元的行
grep '^[M-Z].*[12]' phone.txt 列印所有姓的開頭是M到Z之間任一字元,並且點號號碼結尾是1或者2的行

wc命令 //統計指定文字檔案的行數,字數,字元數

常用引數:
-c:統計輸出的位元組數
-l:統計輸出行數
-L:統計輸出最長一行的長度
-w:統計輸出單詞數

[[email protected] ~]# cat f1.txt 
aaa 
bbb 
ccc 
ddd 
eee 
fff 
[[email protected] ~]# cat f2.txt 
ddd 
eee 
fff 
ggg 
hhh 
取出相同的行: 
[[email protected] ~]# grep -wf f1.txt f2.txt 
ddd 
eee 
fff

[[email protected] ~]# grep -Fxf f1.txt f2.txt 
ddd 
eee 
fff

取出不同的行:

[[email protected] ~]# grep -Fvxf <(grep -Fxf f1.txt f2.txt ) f1.txt f2.txt 
f1.txt:aaa 
f1.txt:bbb 
f1.txt:ccc 
f2.txt:ggg 
f2.txt:hhh 
f2.txt:

[[email protected] ~]# grep -wvf  f1.txt f2.txt 
ggg 
hhh

[[email protected] ~]# grep -wvf  f2.txt f1.txt 
aaa 
bbb 
ccc

補充重要知識點:

grep : g (globally) search for a re (regular expression ) and p (print ) the results. 

 ◎語法: grep [options]  PATTERN  [FILE...]  
 grep用以在file內文中比對相對應的部分,或是當沒有指定檔案時,  
 由標準輸入中去比對。 在預設的情況下,grep會將符合樣式的那一行列出。

         此外,還有兩個程式是grep的變化型,egrep及fgrep。           
         其中egrep就等同於grep -E ,fgrep等同於grep -F 。

 ◎引數 
    1. -A NUM,--after-context=NUM  
               除了列出符合行之外,並且列出後NUM行。 
              
         ex:   $ grep -A 1 panda file  
               (從file中搜尋有panda樣式的行,並顯示該行的後1行) 
                                  
    2. -a或--text   
               grep原本是搜尋文字檔,若拿二進位的檔案作為搜尋的目標, 
               則會顯示如下的訊息: Binary file 二進位檔名 matches 然後結束。 
                   
               若加上-a引數則可將二進位檔案視為文字檔案搜尋, 
               相當於--binary-files=text這個引數。 
             
         ex:   (從二進位檔案mv中去搜尋panda樣式) 
               (錯誤!!!) 
               $ grep panda mv  
               Binary file mv matches   
               (這表示此檔案有match之處,詳見--binary-files=TYPE ) 
               $ 
               (正確!!!) 
               $ grep -a panda mv  
        
    3. -B NUM,--before-context=NUM 
               與 -A NUM 相對,但這此引數是顯示除符合行之外 
               並顯示在它之前的NUM行。         
              
         ex:   (從file中搜尋有panda樣式的行,並顯示該行的前1行) 
               $ grep -B 1 panda file 

    4. -C [NUM], -NUM, --context[=NUM]   
               列出符合行之外並列出上下各NUM行,預設值是2。 
              
         ex:   (列出file中除包含panda樣式的行外並列出其上下2行) 
               (若要改變預設值,直接改變NUM即可) 
               $ grep -C[NUM]  panda file  
              
    5. -b, --byte-offset 
               列出樣式之前的內文總共有多少byte .. 
               
          ex:  $ grep -b  panda file   
       顯示結果類似於: 
         0:panda 
        66:pandahuang 
       123:panda03 
            
    6. --binary-files=TYPE 
               此引數TYPE預設為binary(二進位),若以普通方式搜尋,只有2種結果: 
                 1.若有符合的地方:顯示Binary file 二進位檔名 matches 
                 2.若沒有符合的地方:什麼都沒有顯示。 
                    
               若TYPE為without-match,遇到此引數, 
               grep會認為此二進位檔案沒有包含任何搜尋樣式,與-I 引數相同。 
                    
               若TPYE為text, grep會將此二進位檔視為text檔案,與-a 引數相同。 
         
     Warning: --binary-files=text 若輸出為終端機,可能會產生一些不必要的輸出。 
               
    7. -c, --count 
       不顯示符合樣式行,只顯示符合的總行數。 
       若再加上-v,--invert-match,引數顯示不符合的總行數。

    8. -d ACTION, --directories=ACTION 
               若輸入的檔案是一個資料夾,使用ACTION去處理這個資料夾。 
       預設ACTION是read(讀取),也就是說此資料夾會被視為一般的檔案; 
       若ACTION是skip(略過),資料夾會被grep略過: 
       若ACTION是recurse(遞),grep會去讀取資料夾下所有的檔案, 
       此相當於-r 引數。

    9.  -E, --extended-regexp 
       採用規則表示式去解釋樣式。 
       
   10.  -e PATTERN, --regexp=PATTERN 
       把樣式做為一個partern,通常用在避免partern用-開始。  

   11.  -f FILE, --file=FILE 
       事先將要搜尋的樣式寫入到一個檔案,一行一個樣式。 
       然後採用檔案搜尋。 
       空的檔案表示沒有要搜尋的樣式,因此也就不會有任何符合。 
        
   ex: (newfile為搜尋樣式檔) 
       $grep -f newfile file    

   12.  -G, --basic-regexp 
       將樣式視為基本的規則表示式解釋。(此為預設)

   13.  -H, --with-filename 
       在每個符合樣式行前加上符合的檔案名稱,若有路徑會顯示路徑。 
        
   ex: (在file與testfile中搜尋panda樣式)    
       $grep -H panda file ./testfile 
                file:panda 
                ./testfile:panda 
                $ 
      
   14.  -h, --no-filename   
               與-H引數相類似,但在輸出時不顯示路徑。

   15.  --help  
               產生簡短的help訊息。

   16.  -I 
               grep會強制認為此二進位檔案沒有包含任何搜尋樣式, 
               與--binary-files=without-match引數相同。 
                    
           ex:  $ grep -I  panda mv

   17.  -i, --ignore-case        
               忽略大小寫,包含要搜尋的樣式及被搜尋的檔案。 
                
           ex:  $ grep -i panda mv 
                 
   18.  -L, --files-without-match  
               不顯示平常一般的輸出結果,反而顯示出沒有符合的檔案名稱。

   19.  -l, --files-with-matches                
               不顯示平常一般的輸出結果,只顯示符合的檔案名稱。

   20.  --mmap                
               如果可能,使用mmap系統呼叫去讀取輸入,而不是預設的read系統呼叫。  
               在某些狀況,--mmap 能產生較好的效能。 然而,--mmap  
               如果運作中檔案縮短,或I/O 錯誤發生時, 
               可能造成未定義的行為(包含core dump),。 
                
   21.  -n, --line-number 
               在顯示行前,標上行號。 
                
            ex:  $ grep -n  panda file   
                顯示結果相似於下: 
                行號:符合行的內容

   22.  -q, --quiet, --silent  
               不顯示任何的一般輸出。請參閱-s或--no-messages

   23.  -r, --recursive 
       遞地,讀取每個資料夾下的所有檔案,此相當於 -d recsuse 引數。

   24.  -s, --no-messages 
       不顯示關於不存在或無法讀取的錯誤訊息。 
      
 小: 不像GNU grep,傳統的grep不符合POSIX.2協定, 
       因為缺乏-q引數,且他的-s 引數表現像GNU grep的 -q 引數。 
       Shell Script傾向將傳統的grep移植,避開-q及-s引數, 
       且將輸出限制到/dev/null。 
     
POSIX: 定義UNIX及UNIX-like系統需要提供的功能。               
     
   25.  -V, --version 
  顯示出grep的版本號到標準錯誤。 
  當您在回報有關grep的bugs時,grep版本號是必須要包含在內的。

   26.  -v, --invert-match 
  顯示除搜尋樣式行之外的全部。 
                    
   27.  -w, --word-regexp 
          將搜尋樣式視為一個字去搜尋,完全符合該"字"的行才會被列出。

   28.  -x, --line-regexp 
  將搜尋樣式視為一行去搜尋,完全符合該"行"的行才會被列出。

例項:
# ps -ef | grep in.telnetd 
root 19955 181 0 13:43:53 ? 0:00 in.telnetd 


# more size.txt size檔案的內容 
b124230 
b034325 
a081016 
m7187998 
m7282064 
a022021 
a061048 
m9324822 
b103303 
a013386 
b044525 
m8987131 
B081016 
M45678 
B103303 
BADc2345 

# more size.txt | grep '[a-b]' 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 
b124230 
b034325 
a081016 
a022021 
a061048 
b103303 
a013386 
b044525 
# more size.txt | grep '[a-b]'* 
b124230 
b034325 
a081016 
m7187998 
m7282064 
a022021 
a061048 
m9324822 
b103303 
a013386 
b044525 
m8987131 
B081016 
M45678 
B103303 
BADc2345 

# more size.txt | grep '單個字元;如[A] 即A符合要求 
b124230 
b034325 
b103303 
b044525 
# more size.txt | grep '[bB]' 
b124230 
b034325 
b103303 
b044525 
B081016 
B103303 
BADc2345 

# grep 'root' /etc/group 
root::0:root 
bin::2:root,bin,daemon 
sys::3:root,bin,sys,adm 
adm::4:root,adm,daemon 
uucp::5:root,uucp 
mail::6:root 
tty::7:root,tty,adm 
lp::8:root,lp,adm 
nuucp::9:root,nuucp 
daemon::12:root,daemon 

# grep '^root' /etc/group 匹配正則表示式的開始行 
root::0:root 


# grep 'uucp' /etc/group 
uucp::5:root,uucp 
nuucp::9:root,nuucp 

# grep '/<uucp' /etc/group 
uucp::5:root,uucp 


# grep 'root$' /etc/group 匹配正則表示式的結束行 
root::0:root 
mail::6:root 

# more size.txt | grep -i 'b1..*3' -i :忽略大小寫 

b124230 
b103303 
B103303 

# more size.txt | grep -iv 'b1..*3' -v :查詢不包含匹配項的行 

b034325 
a081016 
m7187998 
m7282064 
a022021 
a061048 
m9324822 
a013386 
b044525 
m8987131 
B081016 
M45678 
BADc2345 

# more size.txt | grep -in 'b1..*3' 
1:b124230 
9:b103303 
15:B103303 

# grep '$' /etc/init.d/nfs.server | wc -l 
128 
# grep '/$' /etc/init.d/nfs.server | wc –l 忽略正則表示式中特殊字元的原有含義 

15 
# grep '/$' /etc/init.d/nfs.server 
case "$1" in 
>/tmp/sharetab.$$ 
[ "x$fstype" != xnfs ] && / 
echo "$path/t$res/t$fstype/t$opts/t$desc" / 
>>/tmp/sharetab.$$ 
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$ 
/usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab 
if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)' / 
if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && / 
if [ $startnfsd -ne 0 ]; then 
elif [ ! -n "$_INIT_RUN_LEVEL" ]; then 
while [ $wtime -gt 0 ]; do 
wtime=`expr $wtime - 1` 
if [ $wtime -eq 0 ]; then 
echo "Usage: $0 { start | stop }" 

# more size.txt 

the test file 
their are files 
The end 

# grep 'the' size.txt 
the test file 
their are files 

# grep '/<the' size.txt 
the test file 
their are files 

# grep 'the/>' size.txt 
the test file 

# grep '/<the/>' size.txt 
the test file 

# grep '/<[Tt]he/>' size.txt 
the test file

相關推薦

grep語法用法

$ ls -l | grep '^a'通過管道過濾ls -l輸出的內容,只顯示以a開頭的行。$ grep 'test' d*顯示所有以d開頭的檔案中包含test的行。$ grep 'test' aa bb cc顯示在aa,bb,cc檔案中匹配test的行。$ grep '[a-z]\{5\}' aa顯示所有包

C/C++語法用法技巧(指針)

lin 調用 comment c/c++ line x11 space cti 用法 void * fun( ) ; //聲明一個返回值是任意類型的指針 的函數fun() void vfun( ) ; //聲明一個沒有返回值 的函數vfun() void (*)

FindWindowFindWindowEx的語法用法

1 函式原型:   HWND FindWindow   (   LPCSTR lpClassName,   LPCSTR lpWindowName    ); 2 引數表:   lpClassName   指向一個以null結尾的、用來指定類名的字串或一個可以確定類名字串的原

mysql數據庫 BETWEEN 語法用法邊界值解析

not src 之間 ont 技術 cnblogs http 結果 spa between用法:   用於where表達式中,選取兩個值之間的數據,如: 1 SELECT id FROM user WHERE id BETWEEN value1 AND value2;

編程語言和shell編程的基礎內容以及grep、egrep命令及相應的正則表達式用法

編程語言和shell編程的基礎內容以及grep、egrep命令及相應的正則表達式和用法bash的特性之多命令執行的邏輯關系: 1.命令替換(命令之間無明確的邏輯依賴關系) COMMAND1 $(COMMAND2) 2.管道(命令之間無明確的邏輯依賴關系) COMMAND1 | COMMAND2

Shell程式設計中if的語法常見判斷用法

if, for, while幾乎是所有程式語言的關鍵字,在Shell程式設計中也不例外,其中if是使用頻率最高的,由於Shell程式設計中不存在物件(Object)的概念,因此在if的比較判斷中主要是對字串、數字的值進行比較判斷的: 一. if的基本語法 1. if與[之間要有空格 2. []與判斷

Xml一(基本語法約束)、

字符 一行 語言 oca cas 書寫 xsd ati 寫法 XML:eXtensible Markup Language 可擴展標記語言 version="1.0"     * 可擴展:所有的標簽都是自定義的。     * 功能:數據存儲     * 配置文件  

Linux中grep搜索用法

輸出 ber linu 大小 magic add option 正則表達 查找 有測試文件test.txt一枚,內容如下 aaabbbcccAAADDDEEEabcsdfjasldjfbcdokmABC 一、基本搜索常用1、現在想把abc okm篩選出來 grep "abc

position的定義用法

位置 stat top 沒有 出現 瀏覽器 第一個 sta class absolute 生成絕對定位的元素,相對於 static 定位以外的第一個父元素進行定位。 元素的位置通過 "left", "top", "right" 以及 "bottom" 屬性進行規定。

GET,POST,PUT,DELETE的區別 用法

網關 到你 服務端 utf-8 option 數學 返回 由於 ces Http定義了與服務器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網絡上的資源,而HTTP中

robots.txt的語法寫法詳解

html txt 訪問 isa 字符 包含 all 屏蔽 有道 robots.txt是一個純文本文件,是搜索引擎蜘蛛爬行網站的時候要訪問的第一個文件,當蜘蛛訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜索機器人就會按照該文件中的內容來確

花了兩天時間學習了 sass, less, stylus的基本語法簡單使用, 談談感受.

列表 stylus 單點 blank 明顯 一點 css 自動編譯 數據 花了兩天時間學習了 sass, less, stylus的基本語法和簡單使用, 談談感受. 1. 變量的問題 1.1變量的表示 sass有個$var, [email protected]/

emrem的概念用法

繼承 瀏覽器 不支持 pan rem 一個 size nbsp 計算 em 相對長度單位 相對參照物為父元素的font-size em有繼承性 沒有設置font-size時, 瀏覽器會有一個默認的em設置 rem 相對參照物為根元素html, 相當於參照物固定不變 比

nth-child,nth-last-child,only-child,nth-of-type,nth-last-of-type,only-of-type,first-of-type,last-of-type,first-child,last-child偽類區別用法

type nth 只有一個 not 同時 選擇器 -type span 進行 我將這坨偽類分成三組,第一組:nth-child,nth-last-child,only-child第二組:nth-of-type,nth-last-of-type,第三組:first-of-tp

Kotlin基本語法使用

activit ext eset ans 默認 構造器 span 變量 tag Kotlin 是一個基於 JVM 的新的編程語言,由 JetBrains 開發。與Java相比,Kotlin的語法更簡潔、更具表達性,而且提供了更多的特性。 Kotlin是使

Java中枚舉的寫法用法

一個 lang 公司 nbsp -h Language integer com bsp 在公司代碼中,用了一大堆的枚舉,看得我好懵逼。下面開始看看枚舉怎麽寫和怎麽用。一、枚舉的寫法 關於枚舉的寫法,網上好多這方面的知識。這裏直接貼一個我自己寫的

linux有關命令的幫助用法查看

linux基礎命令 man whatis info 本文檔主要整理了當使用linux命令時遇到瓶頸時可以解決/找到所需命令的方法,寫的不全,後續補充,1:whatis 命令 ##查看命令的功能 命令 --help ##查看命令的幫助 [] ##選

shell grep的一些用法

shell#1、統計字符總行數#統計系統中不允許登錄的用戶數grep -c ‘nologin‘ /etc/passwd#2、不區分大小寫查找指定字符的所有行;grep -i ‘good‘ 9.txt#3、打印指定字符的行及行號;grep -n "good" 9.txt#4、不打印指定字符的行grep -v "

隱藏覆蓋的區別用法

靜態方法 類的變量 靜態 如何 區別 參數類型 子類重寫 pre 父類 講隱藏和覆蓋之前先看兩個概念:靜態類型和動態類型。 任何一個引用變量都有兩個類型:一個叫靜態類型,也就是定義該引用變量的類型;另一個叫動態類型,也就是該引用實際指向的對象類型。 比如對於兩個類A和類B,

JSP學習筆記(一):JSP語法指令

沒有 文件的 encoding 引入 2.0 .cn name blog .get 一、語法 1、腳本程序的語法格式:   腳本程序可以包含任意量的Java語句、變量、方法或表達式,只要它們在腳本語言中是有效的。 <% 代碼片段 %> 2、中文編碼問題