grep詳解
簡介:grep:(global search regular expression(RE))and print out the line
文本搜索工具,根據用戶指定的文本模式對目標文件進行逐行搜索,顯示能夠被模式所匹配到的行。
正則表達式:是一類字符所書寫出來的模式(PATTERN)
模式分爲:基本正則表達式和擴展正則表達式
元字符:不表示字符本身的意義,用於額外功能性的描述
基本正則表達式的元字符:元字符使用引號
grep格式:grep [option] 'PATTERN' file
grep選項:
--color:把匹配到文本顯示顏色,精確匹配
-E:使用擴展正則表達式
-v:取反,不能被模式所匹配到的行
-o:僅匹配被模式匹配到的字符串,而非整行
-i:不區分字符大小寫
-C:被模式匹配到的上下各顯示一行
其正則如下:
1、字符匹配:爲了在不同國家的字符編碼中保持一致性使用POSIX(The Portable Operating System Interface)增加了特殊的字符類,其內容如下,但要注意,使用字符匹配時只能做模糊匹配,不能夠精確匹配,例如使用[[:upper:]]不僅能夠匹配到單個的大寫字符,還能匹配到小寫字符,這是因爲工作在貪婪模式下。
貪婪模式:儘可能長的去匹配
.:任意單個字符
[]:指定範圍內的任意單個字符
[[:upper:]]:大寫字符,同[A-Z]
[[:lower:]]:小寫字符,同[a-z]
[[:digit:]]:數字,同[0-9]
[[:alpha:]]:任意字符
[[:alnum:]]:字母加數字
[[:punct:]]:標點符號
[[:space:]]:空白字符
[^]:指定範圍外的任意單個字符
2、次數匹配:用來指定匹配其前面的字符的次數
*:任意次
.*:匹配任意長度的任意字符
\?:0次或1次
\{m\}:匹配m次
\{m,n\}:至少m次,最多n次
\{m,\}:至少m次
\{0,n\}:至多n次
3、位置錨定:用於指定字符出現的位置
^:錨定行首,^char
$:錨定行尾,char$
^$:空白行
4、單詞位置錨定:
\<char:錨定詞首,\bchar
char\>:錨定詞尾,char\b
5、分組:
\(string\):string字符去匹配
6、引用:
\n:後向引用,引用前面第n個左括號以及與之對應的右括號中的模式所匹配到的內容
\(a.b\)xy\1----->a5bxya5b
擴展正則表達式:egrep,同grep -E
1、字符匹配:同正則表達式
2、次數匹配:
*:匹配其前面的字符任意次
?:匹配其前面的字符0次或一次
+:匹配其前面的字符至少一次
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
3、錨定:
^:行首
$:行尾
\<,\b:詞首
\>,\b:詞尾
4、分組:
():分組
|:或者,字符或者
fgrep:不解析正則表達式,直接按字符去匹配
例題:
1、 顯示/proc/meminfo文件中以大小寫s開頭的行
# grep -i “^s” /proc/meminfo
# grep “^[Ss]” /proc/meminfo
2、 取出默認shell爲bash的用戶
# grep “bash$”/etc/passwd |cut -d: -f1
# grep -E “bash$”/etc/passwd|cut -d: -f1
3、 取出默認shell爲bash的且其ID號最大的用戶
# grep “bash$”/etc/passwd | sort -n -t: -k3|tail -1|cut -d: -f1
# grep -E “bash$” /etc/passwd | sort -n -t: -k3|tail -1|cut -d: -f1
4、 顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}"/etc/rc.d/rc.sysinit
grep -E “^#[[:space:]]{1,}[^[:space:]]{1,}”/etc/rc.d/rc.sysinit
5、 顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行
# grep "^[[:space:]]\{1,\}"/boot/grub/grub.conf
# grep -E"^[[:space:]]{1,}" /boot/grub/grub.conf
6、 找出/etc/passwd文件中一位數或兩位數
# grep --color=auto “\>[[:digit:]]\{1,2\}\>” /etc/passwd
# grep --color=auto -E "\<[[:digit:]]{1,2}\>" /etc/passwd
7、 找出ifconfig命令結果中的1-255之間的整數
# ifconfig | grep -E--color=auto"\<[1-9][0-9][0-9]\>\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}"
8、 查看當前系統上root用戶的所有信息
# grep “^root\>” /etc/passwd
# grep"^root\>" /etc/passwd
9、 添加用戶testbash和bash和basher,而後查找出當前系統上用戶名和shell相同的用戶
# useradd bash
# useradd testbash
# useradd basher
# grep “^\([[:alnum:]]\{1,\}\)\>.*\1$”/etc/passwd
# grep --color=auto -E "^([[:alnum:]]{1,})\>.*\1$" /etc/passwd
10、 找出netstat -tan命令結果中以LISTEN或ESTABLISHED結尾的行
# netstat -tan| grep"[LISTEN|ESTABLISHED]$"
# netstat -tan| grep -E "(LISTEN|ESTABLISHED)\>"
11、 取出當前系統上所有用戶的shell,要求:每種shell只顯示一次,並按升序顯示
cut -d: -f7 /etc/passwd|sort -u