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