grep与正则表达式基础
目錄
???????? grep
???????? 正則表達式
grep用法簡介
我們介紹GREP的用法,主要用于匹配行,我們借助下面的正則表達式來介紹如何使用grep,還有就是正則表達式在linux中是極為重要的一部分。
1 命令:grep 2 格式:grep [option] "pattern" filename 3 選項: 4 -v:反向選擇 5 -i:忽略大小寫 6 -n:顯示行號 7 -c:統(tǒng)計行數(shù) 8 -o:僅顯示匹配到的字符串 9 -w:匹配整個單詞 10 -q:不輸出任何信息 11 -A 2:after 顯示后2行 12 -B 3:before 顯示前3行 13 -C 3:context 前后各3行 14 -e:實現(xiàn)多個選項間的邏輯關(guān)系 15 grep -e root -e mail /etc/passwd 16 -E:相當于egrep,用于使用拓展的正則表達式 17 -F:相當于fgrep,不支持正則表達式正則表達式(Regular expression)
什么是正則表達式
???????? Regular expression(正則表達式)是由一類特殊字符及文本字符編寫的模式,其中有些字符(元字符)不代表字符的字面意義,而表示控制或通配功能。
那些程序支持正則表達式
???????? grep,sed,awk,vim,less,nginx,varnish
在man中查詢
???????? 我們可以在正則man手冊中查找正則的用法
???????? man 7 regex
?
正則表達式的分類
???????? 基本正則表達式
???????? 擴展的正則表達式
????????
元字符的分類
???????? 字符匹配,匹配次數(shù),位置錨定,分組
????????
基礎(chǔ)RE(用于grep)
???????? 字符匹配? ? ? ? ? ? ? ?
1 . 匹配任意單個字符 2 [] 匹配指定范圍內(nèi)的任意單個字符 3 [^] 匹配指定范圍外的任意字符???????? 匹配次數(shù):用在要指定的次數(shù)的字符后面,用于指定前面的字符出現(xiàn)的次數(shù)
1 * 匹配前面的字符任意次(包括0次) 2 .* 任意長度的任意字符 3 \? 匹配前面的字符0次或一次 4 \+ 匹配前面的字符至少一次 5 \{n\} 匹配前面的字符n次 6 \{m,n\} 匹配前面的字符至少m次,最多n次 7 \{,n\} 匹配前面的字符最多n次 8 \{n,\} 匹配前面的字符最少n次???????? 位置錨定:用于定位出現(xiàn)的位置
1 ^ 行首錨定 2 $ 行尾錨定 3 ^$ 空行 4 ^[[:space:]]$ 空白行 5 \<,\b 詞首錨定,用于單詞模式的左側(cè) 6 \>,\b 詞尾錨定,用于單詞模式的右側(cè) 7 \<pattern\> 匹配整個單詞???????? 分組:
?????????????????? \(\)將一個或多個字符捆綁在一起,當做一個整體進行處理,如\(root\)\+
?????????????????? 分組括號中的模式匹配到的內(nèi)容會被正則表達式引擎記錄在內(nèi)部的變量中,這些變量的命令方式為\1,\2,\3...
?????????????????? \1???? 表示從左側(cè)起第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
?????????????????? 示例:
??????????????????????????? \(string1\+\(string2\)*\)
???????????????????????????????????? \1:string1\+\(string2\)*
???????????????????????????????????? \2:string2
? ? ? ? ?后向引用:
? ? ? ? ? ? ? ? ? ?引用前面的分組括號中的模式所匹配的字符,而非模式本身
?????????或者:\|
???????????????????????????
擴展RE(用于egrep或grep —E)
?
???????? 字符匹配:
1 . 匹配任意單個字符 2 [] 匹配指定范圍內(nèi)的任意單個字符 3 [^] 匹配指定范圍外的任意字符???????? 匹配次數(shù)? ? ? ? ? ??
1 * 匹配前面的字符任意次(包括0次) 2 ? 匹配前面的字符0次或一次 3 + 匹配前面的字符至少一次 4 {n} 匹配前面的字符n次 5 {m,n} 匹配前面的字符至少m次,最多n次???????? 位置錨定
???????? 分組:
1 () 2 后向引用: \1, \2, ... ? ? ? ? ? ? ? ? ? ?????????? 或者:
1 a|b: a或b 2 C|cat: C或cat 3 (C|c)at:Cat或cat ?????????? 特殊字符????????????????????????????????????
[:alnum:] 字母和數(shù)字[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z[:lower:] 小寫字母[:upper:] 大寫字母[:blank:] 水平空白字符(空格和制表符)[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范圍廣)[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)[:digit:] 十進制數(shù)字[:graph:] 可打印的非空白字符[:print:] 可打印字符[:punct:] 標點符號[:xdigit:] 十六進制數(shù)字 ? ? ? ? ? ? ? ? ? ? ? ??????????????????????????????????????
grep
1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
cat /proc/meminfo | grep "^[sS]" cat /proc/meminfo | grep "^[s\|S]" cat /proc/meminfo | grep "^s\|^S"?
2、顯示/etc/passwd文件中不以/bin/bash結(jié)尾的行
cat /etc/passwd | grep -v "/bin/bash$"
?
3、顯示用戶rpc默認的shell程序
cat /etc/passwd | grep "^rpc\>" | grep -o "[^/]\+$" cat /etc/passwd | grep "^rpc\>" | cut -d"/" -f6
?
4、找出/etc/passwd中的兩位或三位數(shù)
cat /etc/passwd | grep "\b[0-9]\{2,3\}\b"
?
5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白?字符的行
cat grub2.txt | grep "^[[:space:]]\+[[:graph:]].*"
?
6、找出“netstat -tan”命令的結(jié)果中以‘LISTEN’后跟任意多個空白字符結(jié)尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
?
7、顯示CentOS7上所有系統(tǒng)用戶的用戶名和UID
cat /etc/passwd | cut -d ":" -f 1,3 | grep -v "\b0$" | grep "\b[0-9]\{1,3\}\b" cat /etc/passwd | cut -d ":" -f 1,3 | grep -ve "\b0$" -e "[0-9]\{4,\}"?
8、添加用戶bash、 testbash、 basher、 sh、 nologin(其shell為/sbin/nologin),找出?/etc/passwd用戶名同shell名的行
cat /etc/passwd | grep "\(^[[:alnum:]]\+\>\).*\<\1$"?
9、利用df和grep及sort,取出磁盤各分區(qū)利用率,并從大到小排序
df | grep "/dev/sd" | grep -o "[0-9]\{1,\}%" | sort -nr?
egrep
1、顯示三個用戶root、 mage、 wang的UID和默認shell
cat /etc/passwd | egrep "^root|^mage|^wang" | tr -s ":" "/" | cut -d"/" -f3,8 cat /etc/passwd | egrep "^root|^mage|^wang" | cut -d":" -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行?
cat /etc/rc.d/init.d/functions | egrep -o "^([[:alpha:]]+|_).*[[:graph:]]\(\)" cat /etc/rc.d/init.d/functions | egrep -o "^.*[[:grpha:]]\(\)" cat /etc/rc.d/init.d/functions |egrep -o "^.*\>\(\)"3、使用egrep取出/etc/rc.d/init.d/functions中其基名?
echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/*$" echo /etc/rc.d/init.d/functions | egrep -o "\b[[:alnum:]]+/?$" echo /etc/rc.d/init.d/functions |egrep "[^/]+/?$" -o?
?
4、使用egrep取出上面路徑的目錄名?
echo /etc/rc.d/init.d/functions | egrep -o ".*/\<" echo /etc/rc.d/init.d/functions |egrep -o ".*/." |egrep -o?
?
5、統(tǒng)計last命令中以root登錄的每個主機IP地址登錄次數(shù)
last | grep ^root | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq -c?
6、利用擴展正則表達式分別表示0-9、 10-99、 100-199、200-249、 250-255
echo {1..1000} | egrep -o "\b[0-9]\b" | tr "\n" " " ;echo echo {1..1000} | egrep -o "\b[0-9]{2}\b" | tr "\n" " " ;echo echo {1..1000} | egrep -o "\b1[0-9]{2}\b" | tr "\n" " " ;echo echo {1..1000} | egrep -o "\b2[0-4][0-9]\b" | tr "\n" " " ;echo echo {1..1000} | egrep -o "\b25[0-5]\b" | tr "\n" " " ;echo?
7、顯示ifconfig命令結(jié)果中所有IPv4地址
ifconfig|egrep -o "\<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4]0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"?
8、將此字符串: welcome to magedu linux 中的每個字符去重并排序,重復(fù)次數(shù)多的排到前面
echo "welcome to magedu linux" | tr -d " " | grep -o "." | sort | uniq -c | sort -nr? ? ? ? ? ??? ? ? ? ? ? ? ? ? ? ??
????????????????????????????????????
轉(zhuǎn)載于:https://www.cnblogs.com/duzhaoqi/p/7256307.html
總結(jié)
以上是生活随笔為你收集整理的grep与正则表达式基础的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并查集:POJ1182-食物链(并查集比
- 下一篇: [ACM] hdu 1228 A+B (