Linuxgrep命令用法以及Regex

來源:互聯網
上載者:User

Linuxgrep命令用法以及Regex

1.grep命令和Regex的簡介

(1).grep(Global search REgular expression and Print out the line),即全域搜尋Regex並列印出匹配的行,它是Linux系統中一個強大的文本搜尋工具,它根據使用者指定的“模式(pattern)”對目標文本進行過濾,顯示被模式比對到的行;

(2).Regex是由一類字元書寫的模式,其中有些字元不表示符的字面意義,而是表示控制或通配的功能

2.grep命令的基本文法格式

grep [OPTION]... 'PATTERN' FILE...

grep的常用選項:

-v : 對匹配的行進行取反

-o : 僅顯示匹配到的內容

-i : 忽略字元大小寫

-n : 為匹配的行加上行號

-E : 使用擴充Regex ,等同於egrep命令

-F : 不使用Regex搜尋,等同於fgrep命令

-A # : 連同匹配行的下#行一併顯示,#代表任一數字

-B # : 連同匹配行的上#行一併顯示,#代表任一數字

-C # : 連同匹配行的上下#行一併顯示,#代表任一數字

--color=auto : 對匹配的內容以不同的顏色顯示

3.grepRegex的基本用法

基本Regex:

(1)字元匹配

. : 匹配任意單個字元

例:匹配以r開頭,t結尾中間只隔了兩個字元的行

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

常用的集合表示方法有:

純數字:[[:digit:]]或[0-9]

小寫字母:[[:lower:]]或[a-z]

大寫字母:[[:upper:]]或[A-Z]

大小寫字母:[[:alpha:]]或[a-zA-Z]

數字加字母:[[:alnum:]]或[0-9a-zA-Z]

空白字元:[[:space:]]

標點符號:[[:punct:]]

例1:匹配包含數字0或2的行(只包含前半部分)

例2:匹配包含字母r或t的行(只包含前半部分)

例3:匹配包含數字0-9的行(只包含前半部分)

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

例:匹配包含除1-9範圍之外的字元的行(只包含前半部分)

(2)次數匹配

* : 匹配其前面的字元出現任意次,0、1或多次的行

例:建立一個測試文本,包含有以下內容:

匹配x字母出現任意次的行:

\+ : 匹配其前面的字元出現1次或多次的行

例:匹配x字至少1次的行

\? : 匹配其前面的字元出現0次或1次的行

例:匹配x字母出現0次或1次的行

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

例:匹配x字母出現2次的行

\{m,n\} : 匹配其前面的字元至少出現m次,至多出現n次的行,m和n表示一個範圍m-n

例:匹配x字母至少出現1次,至多出現3次的行

(3)位置錨定

^ : 行首錨定

例:匹配x字母出現在在行首的行

$ : 行尾錨定

例:匹配e字母出現在行尾的行

^$ : 匹配空白行

例:匹配空白的行

\< : 詞首錨定

例:精確匹配xy兩個字母在一個單詞的詞首的行

\> : 詞尾錨定

例:精確匹配xy兩個字母在一個單詞的詞尾的行

\<\> : 匹配單詞

例:匹配包含xy這個單詞的行

(3)分組

\(\) : 對某字串進行進行分組匹配

例:匹配xy單啟出現0次或1次的行

後向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式比對到了某內容,此內容後面的模式中可以被引用;

對前面的分組進行引用的符號為:\1 , \2 ,\3

模式自左而右,引用第#個左括弧以及與其匹配右括弧之間的模式比對到的內容;

後向引用舉例:

建立一個文字檔,假設有如下內容:

找出前後都有相同單詞的行:

Regex元字元總結:

字元匹配:. ,[] ,[^]

次數匹配:* ,\? ,\+ ,\{m\} ,\{m,n\}

位置錨定:^ ,$ ,\< ,\> ,\<\>

分組匹配:\(\)

4.egrep及擴充Regex:

egrep相當於grep -E,egrep可以直接使用擴充Regex,而grep需要加上選項-E;

擴充Regex的元字元:

字元匹配:. ,[] ,[^]

次數匹配:*,?,+,{m},{m,n},{m,},{0,n}

位置錨定:^,$,\>,\<

分組匹配:(),支援後向引用

| : 匹配左側或右側合格行,比如a|b,含有a或b的行都匹配;

例1:egrep 等同於 grep -E

例2:

5.grep練習題:

(1).顯示/proc/meminfo檔案中以大寫或小寫s開頭的行;

# grep -i '^s' /proc/meminfo

(2).顯示/etc/passwd檔案中其預設shell為非/sbin/nologin的使用者;

# grep -v '/sbin/nologin$' /etc/passwd | cut -d: -f1

(3).顯示/etc/passwd檔案中其預設shell為/bin/bash的使用者

進一步:僅顯示上述結果中其ID號最大的使用者

# grep '/bin/bash$' /etc/passwd | cut -d: -f1 | sort -n -r | head -1

(4).找出/etc/passwd檔案中的一位元或兩位元;

# grep '\<[[:digit:]]\{1,2\}\>' /etc/passwd

(5).顯示/boot/grub/grub.conf中至少一個空白字元開頭的行

# grep '^[[:space:]]\+.*' /boot/grub/grub.conf

(6).顯示/etc/rc.d/rc.sysinit檔案中,以#開頭,後面跟至少一個空白字元,而後又有至少一個非空白字元的行;

# grep '^#[[:space:]]\+[^[:space:]]\+' /etc/rc.d/rc.sysinit

(7).找出netstat -tan命令執行結果中包含'LISTEN'的行;

# netstat -tan | grep 'LISTEN[[:space:]]*$

(8).添加使用者bash,testbash,basher,nologin(SHELL為/sbin/nologin),而找出當前系統上其使用者名稱和預設SHELL相同的使用者;

# grep '\(\<[[:alnum:]]\+\>\).*\1$' /etc/passwd

(9).擴充題:建立一個文字檔,假設有如下內容:

He like his lover.

He love his lover.

He like his liker.

He love his liker.

找出其中最後一個單詞是由此前某單詞加r構成的行;

# grep '\(\<[[:alpha:]]\+\>\).*\1r' grep.txt

(10).顯示當前系統上root、centos或user1使用者的預設shell及使用者名稱;

# grep -E '^(root|centos|user1\>)' /etc/passwd

(11).找出/etc/rc.d/init.d/functions檔案中某單詞後面跟一對小括弧'()"的行;

# grep -o '\<[[:alpha:]]\+\>()' /etc/rc.d/init.d/functions

(12).使用echo輸出一個路徑,而使用egrep取出其基名;

# echo /etc/rc.d/ | grep -o '[^/]\+/\?$' | grep -o '[^/]\+'

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.