grep的基本用法詳解

 grep是linux上常用的一個文本處理工具之一。它有著強大的文本處理能力,學會它,可以讓工作更有效率。

一、初識grep

  grep: Global search Regular Experssion and Print out line

  從名字上也可以直觀的了解到它是基于正則表達式進行全局搜索,并把結果打印到屏幕上來。

  說白了,它就是根據用戶指定的“模式(pattern)”來對文本進行過濾,并顯示匹配到的行的文本搜索工具。


二、何為“模式”

  所謂模式,就是由一類字符書寫,但是這些字符不表示字符本身字面的意義,而是表示控制或通配的功能。它還有一個高雅的名字,即正則表達式。


三、了解正則表達式

 1、基本的元字符

    .   匹配任意的字符

    *   匹配其前面的字符任意次數,0,1或多次

    \?  匹配其前面的字符0次或1次

    \+  匹配其前面的字符1次以上

  2、按字符匹配:

    .:   匹配任意單個字符

    []:   匹配指定集合中的任意單個字符

       常用的字符集合:

         [[:digit:]],[0-9]  表示0-9的任意數字

         [[:lower:]], [a-z]  表示26個小寫英文字母

         [[:upper:]], [A-Z]  表示26個大寫英文字母

         [[:alpha:]], [a-zA-Z] 表示所有英文字母

         [[:alnum:]], [[0-9a-zA-Z] 表示數字,所有英文字母

         [[:space:]]  表示空白字符

         [[:punct:]]  表示符號字符

    [^]:  匹配指定集合外的任意單個字符

  3、按匹配次數匹配:

   * : 匹配其前面任意字符任意次數

   \?: 匹配其前面的字符0次或1次

   \+: 匹配其前面的字符出現至少1次

   \{m\}: 匹配其前面的字符出現m次

   \{m,n\}: 匹配其前面的字符至少m次,至多n次

   .* : 常用組合,表示任意長度的任意字符

  4、實現位置錨定

   ^ : 寫在模式的最左側,表示錨定行首

   $ : 寫在模式的最右側,表示錨定行尾

   \<: 寫在要查找的單詞模式的左側,做單詞詞首錨定

   \>: 寫在要查找的單詞模式的右側,做單詞詞尾錨定

   ^$: 常用組合,表示空白行

   \<pattern\>: 匹配單詞

  5、實現分組(只要功能可以用于實現后向引用)

    \(\): 在模式中,如果使用了分組,在某行文本檢測中,如果\(\)匹配到了某內容,此內容可以在后面的模式中被引用。

    \# : 引用之前被\(\)所匹配到的內容,模式自左而右,引用第#個左括號以及其匹配右括號之間的模式匹配到的內容。


三、grep命令

  1、基本語法:  

     grep [OPTIONS] PATTERN [FILE…]

     常用選項:

       -i, –ignore-case  : 忽略字符大小寫

       -o, –only-matching : 只顯示被模式匹配到的內容

       -v, –invert-match : 反向選取,顯示被模式匹配到的內容的相反內容

       -A #,–after-context=#: 顯示被模式匹配到的行和此行之后的#行

       -B #,–before-context=#: 顯示被模式匹配到的行和此行之前的#行

       -C #,–context=#: 顯示被模式匹配到的行和此行前后的#行 

       -r, -R, –recursive: 遞歸查詢,對目錄下的子目錄也會進行查詢

       -E, –extended-regexp: 使用擴展正則表達式進行匹配,相當于egrep

       -F, –fixed-strings: 不使用正則表達式經行匹配,即忽略元字符的意義,相當于fgrep

       –color={never,always,auto}:可以設置顏色顯示,可以進行別名,方便使用。例如:alias grep='grep –color=auto'


四、知識點練習

接下來我們以以下文本文件的內容來進行練習

blob.png

練習1:顯示b出現3次以上的行

grep "b\{3,\}" test.txt

blob.png

練習2:統計文本文件中work|WORK出現的次數

grep -i -o "\<work\>" test.txt | wc -l

blob.png

練習3:顯示所有包含符號的行

grep "[[:punct:]]" test.txt

blob.png

練習4:找出其中最后一個單詞是由此前某單詞加er構成的行。

grep "\(\<[[:alpha:]]\+\>\).*\1er" test.txt

blob.png


五、實際的應用

有了以上的知識儲備,我們就可以用grep來進行一些基本的處理工作了。

1、在/etc/passwd上查找以/sbin/nolog結尾的行,即可以使用以/bin/nologin為結束的位置錨定進行選取

grep "/sbin/nologin$" /etc/passwd

QUAU2MM7V8]U3NFFHV[[CK2.png

2、在/etc/passwd上查找用戶id和組id在500到1099之間的行

grep "\<1\?[05][0-9][0-9]\>" /etc/passwd

blob.png

3、查找當前系統上網卡驅動程序的名稱

#顯示pci設備中網卡的信息
#最前面的 “02:01.0” 就是設備在PCI總線上的代號,該代號在整個系統中是唯一的。(因為當前系統上有兩塊網卡,所以有兩條信息)
[root@localhost tmp]# lspci | grep "Ethernet"
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:05.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)

#sys目錄是內核將設備信息映射出來的一個偽文件系統,所以我們查找到的那一行信息中drivers的子目錄e1000即是網卡設備的驅動名稱
[root@localhost tmp]# find /sys/bus/pci/drivers | grep "02:01.0"
/sys/bus/pci/drivers/e1000/0000:02:01.0

其實要做的事也就2步,然后我們可以把這些命令通過管道(|)來把命令連接起來,實現功能。

blob.png

原創文章,作者:封于修,如若轉載,請注明出處:http://www.www58058.com/4746

(0)
封于修封于修
上一篇 2015-05-23
下一篇 2015-05-25

相關推薦

  • TCP連接的狀態詳解以及故障排查

    我們通過了解TCP各個狀態,可以排除和定位網絡或系統故障時大有幫助。(總結網絡上的內容) 1、TCP狀態 linux查看tcp的狀態命令: 1)、netstat -nat  查看TCP各個狀態的數量 2)、lsof  -i:port  可以檢測到打開套接字的狀況 3)、 &nbs…

    Linux干貨 2015-04-03
  • 關于 LVM 邏輯卷管理

                  邏輯卷管理 (LVM)    允許對卷進行方便操作的抽象層,包括從新設定文件系統的大小   允許在多個設備間重新組織文件系統將設備指定為物理卷用一個或者多個物理卷來創建一個卷組物理卷是用固定大小的物理區…

    系統運維 2016-09-02
  • Nginx工作原理和優化、漏洞。

    1.  Nginx的模塊與工作原理 Nginx由內核和模塊組成,其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用于URL匹配),而在這個location中所配置的每個指令將會啟動不同的模塊去完成相應的工作。 Nginx的模塊…

    Linux干貨 2015-04-04
  • ?學會用各種姿勢備份MySQL數據庫

                學會用各種姿勢備份MySQL數據庫 前言 為什么需要備份數據? 數據的備份類型 MySQL備份數據的方式 備份需要考慮的問題 設計合適的備份策略 實戰演練 使用cp進行備份 使用mysqldump+復制BINARY …

    Linux干貨 2016-04-27
  • Hadoop簡介

    Hadoop的概要介紹 Hadoop,是一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。 簡單地說來,Hadoop是一個可以更容易開發和運行處理大規模數據的軟件平臺。該平臺使用的是面向對象編程語言Java實現的,具有良好的可移植性。 Hadoop的發展歷史 &nbsp…

    Linux干貨 2015-04-13
  • http協議及httpd特性詳解

    前言 隨著互聯網的迅猛發展和網絡的普及,各類網站層出不窮,網站也成為企業宣傳和實力展現的主要途徑之一,說到網站就不得不說一下web服務了,現在比較流行的web服務還是當屬Apache即httpd。本文將詳解http協議及httpd的特性。 http協議詳解 http協議 http: Hyper Text Transfer Protocol 超文本傳輸協議 傳…

    Linux干貨 2015-04-13

評論列表(7條)

  • stanley
    stanley 2015-05-25 20:52

    才知道封于修不僅武功厲害,文章也相當牛了

    • 封于修
      封于修 2015-05-26 20:02

      @stanley謝謝stanley大哥,不過我還有好長的路需要努力…呵呵

  • 老鼠上了貓
    老鼠上了貓 2015-06-23 17:04

    2、在/etc/passwd上查找用戶id和組id在500到1099之間的行
    grep “\” /etc/passwd
    這樣取是有問題的,[05]是取0或5,那ID為600-1000間的用戶是取不到的。
    中括號只能取一位數,我也不知道怎么取。

    • 封于修
      封于修 2015-06-26 23:03

      @老鼠上了貓你說的對,我沒有考慮清楚。其實嚴謹的寫grep -E “[5-9][0-9][0-9]|10[0-9][0-9]” /etc/passwd 應該才是對的。

    • 老鼠上了貓
      老鼠上了貓 2015-06-29 16:23

      @封于修你這是用戶IP或組ID為500-1099:
      grep -e “[5-9][0-9][0-9]” -e “10[0-9][0-9]” /etc/passwd 這樣也可以
      如果需滿足用戶IP和組IP為500-1099的話,只用grep想不出怎么匹配,用awk就比較簡單了:
      awk -F: ‘$3>=500 && $4<=1099 {print $0}' /etc/passwd

    • 封于修
      封于修 2015-06-29 19:21

      @老鼠上了貓條件式的判斷選取用awk是會更好。
      grep其實也是可以的,就是會很麻煩。
      grep -E “[^:]+:[^:]+:([5-9][0-9][0-9]|10[0-9][0-9]):([5-9][0-9][0-9]|10[0-9][0-9]):.*” /etc/passwd
      我試了一下,這樣寫也是可以匹配得到的?;蛟S會有更簡便的寫法,只能等大神解答了。

    • 老鼠上了貓
      老鼠上了貓 2015-06-29 19:30

      @封于修整行匹配肯定沒問題的,這也是一思路,贊!

欧美性久久久久