1. 程式人生 > >linux文本處理三劍客之grep命令詳解

linux文本處理三劍客之grep命令詳解

gawk 軟件 upper edit 進制 使用 第一個 空格 earch

Linux文本處理三劍客之grep

grep:文本過濾(模式:pattern)工具

grep, egrep, fgrep(不支持正則表達式搜索)

sed:stream editor,文本編輯工具

awk:Linux上的實現gawk,文本報告生成器

grep

  • grep: Global search REgularexpression and Print out the line

作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行

模式:由正則表達式字符及文本字符所編寫的過濾條件

  • grep [OPTIONS] PATTERN [FILE...]

grep root /etc/passwd

grep "$USER" /etc/passwd

grep ‘$USER‘ /etc/passwd

grep `whoami` /etc/passwd

  • grep命令選項

--color=auto: 對匹配到的文本著色顯示(centos6默認沒加,7默認加)

-v: 顯示不被pattern匹配到的行

-i: 忽略字符大小寫

-n:顯示匹配的行號

-c: 統計匹配的行數

-o: 僅顯示匹配到的字符串

-q: 靜默模式,不輸出任何信息

-A #: after, 後#行

-B #: before, 前#行

-C #:context, 前後各#行

-e:實現多個選項間的邏輯or關系

grep –e ‘cat ’ -e ‘dog’ file

-w:匹配整個單詞

單詞數字下劃線不能作為單詞的分隔符,其他可以

-E:使用ERE

-F:相當於fgrep,不支持正則表達式

正則表達式

匹配文件中字符串

  • REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
  • 程序支持:grep,sed,awk,vim, less,nginx,varnish等
  • 分兩類:
  1. 基本正則表達式:BRE
  2. 擴展正則表達式:ERE

grep -E, egrep

  • 正則表達式引擎:

采用不同算法,檢查處理正則表達式的軟件模塊

PCRE(Perl Compatible Regular Expressions)

  • 元字符分類:字符匹配、匹配次數、位置錨定、分組
  • man 7 regex

基本正則表達式元字符(不同於通配符)

  • 字符匹配:

. 匹配任意單個字符

[] 匹配指定範圍內的任意單個字符

[^] 匹配指定範圍外的任意單個字符

^放在[]裏面和外面是不同的概念

[:alnum:] 字母和數字

[:alpha:] 代表任何英文大小寫字符,亦即A-Z, a-z

[:lower:] 小寫字母[:upper:] 大寫字母

[:blank:] 空白字符(空格和制表符)

[:space:]水平和垂直的空白字符(比[:blank:]包含的範圍廣)

[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)

[:digit:] 十進制數字[:xdigit:]十六進制數字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 標點符號

  • 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數

* 匹配前面的字符任意次,包括0次

貪婪模式:盡可能長的匹配

.*任意長度的任意字符

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

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

\{n\}匹配前面的字符n次

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

\{,n\}匹配前面的字符至多n次

\{n,\}匹配前面的字符至少n次

a\|bcd=a或者bcd

\(a\|b\)cd=acd或bcd

  • 位置錨定:定位出現的位置

^ 行首錨定,用於模式的最左側

$ 行尾錨定,用於模式的最右側

^PATTERN$ 用於模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< 或\b詞首錨定,用於單詞模式的左側

\> 或\b詞尾錨定;用於單詞模式的右側

\<PATTERN\>匹配整個單詞=-w

  • 分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+
  • 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
  • \1表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
  • 示例:\(string1\+\(string2\)*\)

\1 :string1\+\(string2\)*

\2 :string2

  • 後向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
  • 或者:\|

示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat

egrep及擴展的正則表達式

  • egrep= grep -E
  • egrep[OPTIONS] PATTERN [FILE...]
  • 擴展正則表達式的元字符:
  • 字符匹配:

. 任意單個字符

[] 指定範圍的字符

[^] 不在指定範圍的字符

擴展正則表達式

  • 次數匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

  • 位置錨定:

^ :行首

$ :行尾

\<, \b :語首

\>, \b :語尾

  • 分組:

()

後向引用:\1, \2, ...

  • 或者:

a|b: a或b

C|cat: C或cat

(C|c)at:Cat或cat

  • 附錄:

~]#ls | grep a*

進入ls列出a開頭的文件,將其中有a行出來,默認不進入目錄。需要將正則表達式加上”a*”

linux文本處理三劍客之grep命令詳解