Linux三劍客之grep使用入門指南

Linux的grep是一個具有強大功能的文本搜索工具,正確的學習和使用,能很大程度上提高工作效率,減輕運維工作所面臨的壓力。

Linux三劍客:grep、sed、awk


一、grep

grep:

(global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具。

Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能

作用:

文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查,它能使用正則表達式搜索文本,并把匹配的行打印出來。

模式:

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

語法:

grep [OPTIONS] PATTERN [FILE…]

model:

root@Eric(Eric) ~]#grep? Eric /etc/passwd

Eric:x:1001:1001::/home/Eric:/bin/bash

grep的基本正則表達式命令選項:

–color=auto: 對匹配到的文本著色顯示

model:

[root@centos6(Eric)~]#grep –color=auto root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

注:因為編輯器的原因,所以顏色沒有高亮顯示

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

[root@centos6(Eric) Eric]#grep -v root passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin

avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

gdm:x:42:42::/var/lib/gdm:/sbin/nologin

pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

注:為了顯示匹配的效果,所以,匹配這個文本有點長,如果自己測試,可以新建或者拷貝一個文件,刪除一些內容。

 

-i: 忽略字符大小寫

[root@centos6(Eric) Eric]#grep eric -i passwd

Eric:x:500:500::/home/Eric:/bin/bash

 

-n:顯示匹配的行號

[root@centos6(Eric) Eric]#grep Eric -n passwd

34:Eric:x:500:500::/home/Eric:/bin/bash

 

注:前面的34就是顯示的行號。

-c: 統計匹配的行數

[root@centos6(Eric) Eric]#grep root -c passwd

2

下面結果證明顯示的匹配到行數是正確

[root@centos6(Eric) Eric]#grep root? passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

 

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

[root@centos6(Eric) Eric]#grep root? -o passwd

root

root

root

root

 

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

[root@centos6(Eric) Eric]#grep root? -q passwd

 

-A #:after,后#行

[root@centos6(Eric) Eric]#grep root? -A 3 passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

-B #:before,前#行

[root@centos6(Eric) Eric]#grep Eric? -B 3 passwd

pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

 

-C #:context,前后各#行

[root@centos6(Eric) Eric]#grep ftp? -C 3 passwd

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

 

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

grep -e ‘Eric’ -e ‘root’ file

 

[root@centos6(Eric) Eric]#grep -e Eric -e root passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

 

-w:匹配整個單詞

 

[root@centos6(Eric) Eric]#grep /var/ftp -w passwd

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

 

-E:使用ERE

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

 

基本正則表達式

REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些自負(元字符)不表示字符字面意義,而表示控制或通配的功能

程序支持:grep,sed,awk,vim,less,nginx,varnish等

 

分兩類:

基本正則表達式:BRE

擴展正則表達式:ERE

grep – E,egrep

正則表達式引擎:

采用不同算法,檢查處理正則表達式的軟件模塊PCRE(Perl Compatible Regular Expressions)

 

元字符分類:

字符匹配、匹配次數、位置錨定、分組

man 7 regex

 

字符匹配:

.: 匹配任意單個字符

 

[root@centos6(Eric) ~]#ls in*

install.log? install.log.syslog

 

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

 

[root@centos6(Eric) ~]#ls in[a-z]tall.log

install.log

 

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

 

[root@centos6(Eric) ~]#touch 968a.log

[root@centos6(Eric) ~]#ls 968[^0-9].log

968a.log

 

[:alnum:]:字母和數字

 

[root@centos6(Eric) ~]#ls [[:alnum:]]*.log

968a.log? 968.log? install.log

 

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

 

[root@centos6(Eric) ~]#ls [[:alpha:]]*.log

install.log

 

[:lower:]:小寫字母

 

[root@centos6(Eric) ~]#touch Eric.log

[root@centos6(Eric) ~]#ls [[:lower:]]*.log

install.log

 

[:upper:]:大寫字母

 

[root@centos6(Eric) ~]#ls [[:upper:]]*.log

Eric.log

 

[:blank:]:空白字符

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

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

[:digit:]:十進制數字

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

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

[:print:]:可打印字符

[:punct:]:標點符號

 

正則表達式

匹配次數:用在用指定次數的字符后面,用于指定前面的字符要出現的次數

 

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

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

.*:任意長度的任意字符

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

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

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

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

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

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

 

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

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

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

^PATTERN$:用于模式匹配整行

^$:空行

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

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

\>或\b:詞尾錨定,用于單詞模式的右側

\<PATTERN\>:匹配整個單詞

 

分組:\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(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

 

model:

1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩 種方法)

[root@centos6(Eric) Eric]#grep -i “^s” /proc/meminfo

SwapCached:??????????? 0 kB

SwapTotal:?????? 2097148 kB

SwapFree:??????? 2097148 kB

Shmem:?????????????? 248 kB

Slab:????????????? 35684 kB

SReclaimable:?????? 9104 kB

SUnreclaim:??????? 26580 kB

 

以下方法都可:

grep “^[Ss]” /proc/meminfo

grep “^S\|^s” /proc/meminfo

grep -e ^s -e ^S? /proc/meminfo

 

2、顯示/etc/passwd文件中不以/bin/bash結尾的行

 

[root@centos6(Eric) Eric]#grep -v “/bin/bash$” /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

3、顯示用戶rpc默認的shell程序

[root@centos6(Eric) Eric]#grep “rpc\b” /etc/passwd? |cut -d: -f7

/??????? sbin/nologin

 

4、找出/etc/passwd中的兩位或三位數

 

[root@centos6(Eric) Eric]#grep –color “[[:digit:]]\{2,3\}” /etc/passwd

 

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

Eric:x:500:500::/home/Eric:/bin/bash

rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

ntp:x:38:38::/etc/ntp:/sbin/nologin

 

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白

字符開頭的且后面存非空白字符的行

 

[root@Eric(Eric) ~]#grep “^[[:space:]]\+[^[:space:]]” /etc/grub2.cfg

 

注:后面顯示內容較多,此處省略。

 

6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行

 

[root@Eric(Eric) ~]#netstat -tan | grep “^LISTEN[[:space:]]\+”

 

7、顯示CentOS7上所有系統用戶的用戶名和UID_

 

[root@Eric(Eric) ~]#cat /etc/passwd | cut -d: -f1,3 | grep “\b[0-9]\?[0-9]\?[0-9]\b”

root:0

bin:1

daemon:2

adm:3

lp:4

sync:5

shutdown:6

halt:7

mail:8

operator:11

games:12

ftp:14

nobody:99

 

8、添加用戶bash、testbash、basher、sh、nologin(其shell 為/sbin/nologin),找出/etc/passwd用戶名同shell名的行_

 

cat /etc/passwd |grep “\(^.*\)\>.*\<\1$”

cat /etc/passwd |egrep “(^.*)\>.*/\1$”

 

9、利用df和grep,取出磁盤各分區利用率,并從大到小排序

[root@centos6(Eric) Eric]#df | grep -o “[[:digit:]]\+%” |sort -nr

31%

18%

7%

0%

 

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

 

model:

1、顯示三個用戶root、mage、wang的UID和默認shell

[root@centos6(Eric) Eric]#cat /etc/passwd | grep -E “^(root|mage|wang)\b” |cut -d: -f3,7

0:/bin/bash

 

2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行

[root@centos6(Eric) Eric]#grep -E “^[[:alpha:]_]+\(\)” /etc/rc.d/init.d/functions

 

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

[root@centos6(Eric) Eric]#echo /etc/rc.d/init.d/functions | grep -Eo “[^/]+/?$”

functions

 

4、使用egrep取出上面路徑的目錄名

[root@centos6(Eric) Eric]#echo /etc/rc.d/init.d/functions | grep -Eo “^/.*/”

/etc/rc.d/init.d/

 

5、統計last命令中以root登錄的每個主機IP地址登錄次數

[root@centos6(Eric) Eric]#last | egrep -o “^root\>.*[0-9]\.[0-9]{1,3}” |tr -s ” ” “#” | cut -d# -f3 |sort -n |uniq -c

1 172.16.15.100

26 172.16.99.1

 

[root@centos6(Eric) Eric]#last | grep ^root | egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}” | sort | uniq -c

1 172.16.15.100

26 172.16.99.1

 

6、利用擴展正則表達式分別表示0-9、10-99、100-199、 200-249、250-255

echo {1..100} |egrep -o “\b[0-9]\b”

echo {1..100} |egrep -o “\b[0-9]{2}\b”

echo {1..1000} |egrep -o “\b1[0-9][0-9]\b”

echo {1..1000} |egrep -o “\b2[0-4][0-9]+\b”

echo {1..1000} |egrep -o “\b25[0-5]+\b”

7、顯示ifconfig命令結果中所有IPv4地址

ifconfig | egrep -o “([0-9]{1,3}\.){3}[0-9]{1,3}”

 

8、將此字符串:welcome to magedu linux 中的每個字符 去重并排序,重復次數多的排到前面

cho “welcome to magedu linux” |grep -Eo [a-z] | sort | uniq -c|sort -nr

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/86664

(0)
泰谷子泰谷子
上一篇 2017-09-09 15:59
下一篇 2017-09-09 16:14

相關推薦

  • 馬哥教育網絡班21期+第一周課程練習

    一、計算機的組成及其功能 自上個世紀40年代開始截止到目前,我們所有的計算機包括手持的智能終端設備,它們整個組織體系設備都是遵循馮諾依曼體系結構。 現代計算機設備的組成部分: 運算器、控制器、存儲器、輸入設備、輸出設備 控制器:控制器是整個計算機的樞紐,一般是控制計算機整個部件之間協調的,比如運算器要想運算的話,首先得從存儲器中取出數值?;蛘咻斎朐O備輸入數?!?/p>

    Linux干貨 2016-07-07
  • rpm詳解

    rpm詳解 rpm詳解 rpm使用方法 rpm起源 rpm是什么 rpm命名格式 rpm優缺點 rpm獲取注意 rpm命令使用 rpm起源  由于在linux中安裝應用程序需要源碼包編譯安裝,對于非專業人員而言難度太大,因而出現一種將源碼編譯好的二進制程序,庫文件,配置文件,幫助文件等打包成一個或多個特定格式的程序包,而管理這類包的工具之一,則稱為…

    Linux干貨 2016-12-23
  • shell編程進階

    2、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息 read -p “Enter you choice yes|no:” Choice Choice1=`echo $Choice | tr ‘[a-z]’ ‘[A-Z]&#8…

    2017-09-16
  • 馬哥教育網絡班19期第一周課程練習

    1、描述計算機的組成及其功能。 從大體上計算機是由cpu、內存、主板、I/O設備、存儲設備組成 cpu的功能就好像人的大腦,控制身體的。嚴格意義上是用來解釋計算機指令以及處理軟件中的數據的。 內存的功能就好像人的大腦記憶區、來存放眼睛看到的世界。嚴格意義上是用于暫時存放cpu中的運算數據,以及與硬盤等外部存儲器交換的數據 主板的功能就好像人的身體,來鏈接身體…

    Linux干貨 2016-06-18
  • 重定向、管道——Linux基本命令(9)

    1.     輸出重定向 Linux默認輸入是鍵盤,輸出是顯示器??梢杂弥囟ㄏ騺砀淖冞@些設置。比如用wc命令的時候本來是要手動輸入一篇文字來計算字符數的,可以直接把一個已經寫好的文件用‘<’指向這條命令,就直接可以統計這個文件的字符數等了。   STDOUT(標準輸出)和STDERR(標準錯誤)可以被重…

    2017-07-20
  • Linux里的用戶與組

    任何事務的進行都離不開管理,脫離了管理的系統將會是一團亂麻。今天就來講講Linux里的用戶與組的管理 首先,用戶與組不會憑空出現,必須得是系統本身或人為創建的 。     所以,系統創建的就叫系統用戶.系統組,用戶創建的就是普通用戶.普通組。 useradd  創建用戶 -u 創建用戶并指定用戶的UID -g…

    2017-07-30
欧美性久久久久