linux命令學習之——grep學習

https://yq.aliyun.com/articles/557814

概要

  • 作爲linux中最爲常用的三大文本(awk,sed,grep)處理工具之一,掌握好其用法是很有必要的。

  • 首先談一下grep命令的常用格式爲:grep [選項] ”模式“ [文件]

  • grep家族總共有三個:grep,egrep,fgrep。

常用選項

  • -E:開啓拓展的正則表達
  • -i:忽略大小寫
  • -v:反過來,只打印沒有匹配的
  • -n:打印行號
  • -w:匹配的需要是整個單詞,即like 匹配like 不能是Liker
  • -c:顯示總共多少行匹配
  • -o:只顯示被模式匹配到的字符串
  • --color:高亮匹配內容
  • -A n :顯示匹配到的字符串所在的行及其後n行,after
  • -B n:顯示匹配到的字符串所在的行及其前n行,before
  • -C n:顯示前後各n行,context

測試文本:/etc/passwd是一個文件在這裏插入圖片描述

  • 實驗
    在這裏插入圖片描述
    在這裏插入圖片描述

模式部分

fgrep

  • 輸入要匹配的字符串,可以用fgrep(fast grep)代替來提高查找速度,如我們要匹配hello.c中的printf的個數:fgrep -c "printf" hello. c\

使用正則

字符匹配
  • 使用正則,這裏:

  • . :任意一個字符。

  • [abc] :表示匹配一個字符,這個字符必須是abc中的一個。

  • [a-zA-Z] :表示匹配一個字符,這個字符必須是a-z或A-Z這52個字母中的一個。-

  • [ ^123] :匹配一個字符,這個字符是除了1、2、3以外的所有字符。

對於一些常用的字符集,系統做了定義:

  • [A-Za-z] 等價於 [[:alpha:]]
  • [0-9] 等價於 [[:digit:]]
  • [A-Za-z0-9] 等價於 [[:alnum:]]
  • tab,space 等空白字符 [[:space:]]
  • [A-Z] 等價於 [[:upper:]]
  • [a-z] 等價於 [[:lower:]]
  • 標點符號 [[:punct:]]
匹配次數:
  • \{m,n\} :匹配其前面出現的字符至少m次,至多n次。
  • \? :匹配其前面出現的內容0次或1次,等價於\{0,1\}
  • * :匹配其前面出現的內容任意次,等價於{0,}
  • 所以 ".*" 表述任意字符任意次,即無論什麼內容全部匹配。
    實驗:
    在這裏插入圖片描述
  • 找出/後接任意個字符,最後以sh結尾的
    在這裏插入圖片描述
  • 找出以sh結尾的前面有2個以內任意字符的
位置錨定
  • ^ :錨定行首
  • $ :錨定行尾。技巧:"^$"用於匹配空白行。
  • \b\<:錨定單詞的詞首。如"\blike"不會匹配alike,但是會匹配liker
  • \b\>:錨定單詞的詞尾。如"\blike\b"不會匹配alike和liker,只會匹配like
  • \B :與\b作用相反。
  • 實驗:
    在這裏插入圖片描述
    在這裏插入圖片描述
分組及引用
  • \(string\) :將string作爲一個整體方便後面引用
    • \1 :引用第1個左括號及其對應的右括號所匹配的內容。
    • \2 :引用第2個左括號及其對應的右括號所匹配的內容。
    • \n :引用第n個左括號及其對應的右括號所匹配的內容。
  • 實驗:
    • 以相同字母開始並結尾的行
      在這裏插入圖片描述
    • 以相同字母開始並結尾的單詞的行
    • 在這裏插入圖片描述
    • 匹配結尾字母到之前第一次出現該字母的字符:
      在這裏插入圖片描述

擴展正則

擴展的(Extend)正則表達式(注意要使用擴展的正則表達式要加-E選項,或者直接使用egrep):

  • 匹配字符:這部分和基本正則表達式一樣

  • 匹配次數:

    • * :和基本正則表達式一樣
    • ? :基本正則表達式是?,二這裏沒有\。
    • {m,n} :相比基本正則表達式也是沒有了\。
      - + :匹配其前面的字符至少一次,相當於{1,}。
  • 位置錨定:和基本正則表達式一樣。、

  • 分組及引用:

    • (string) :相比基本正則表達式也是沒有了\。
    • \1 :引用部分和基本正則表達式一樣。
    • \n :引用部分和基本正則表達式一樣。
  • 條件: a|b :匹配a或b

  • 所以說擴展正則就是 標準的正則應用在grep中嗎

匹配多個文件

  • 如果要在當前目錄下所有. d o c文件中查找字符串“ s o r t”,方法如下: grep "sort" *.doc
  • 或在所有文件中查詢單詞“ sort it” grep "sort it" *

子目錄中查找

  • grep -n "str" -r ./ :這是查找當前目錄下以及下轄子目錄下所有包含str字符串的文件,會列出文件名.以及該行的內容.以及行號
  • 在特定文件中grep某關鍵字,除了使用find 命令加exec選項之外,其實還有更簡單的方法:
    grep -R --include="*.cpp" key dir上述命令的含義:在dir目錄下遞歸查找所有.cpp文件中的關鍵字key
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章