grep:文本搜素工具,根據用戶指定的文本模式對目標文件進行逐行搜索,顯示能被模式所匹配到的行
包含三個命令:grep、egrep(相當於grep -E 擴展的正則表達式)和fgrep(相當於grep -F 只能字符串匹配)
格式:
grep [options] PATTEN filename
options
grep -v (--invert-match):反向匹配,顯示不能被表達式匹配的行
grep -o (--only-matching):僅顯示被模式匹配到的字串,而非整行,將匹配到的字符串一行一個顯示
grep -n :打印行號
grep -q:靜默模式,不輸出任何信息,用於寫腳本時的判斷,和&>/dev/null一樣
grep -c :計算找到匹配項的行數,1行算1次。只顯示行數,不顯示匹配到的行內容
grep -i :不區分字符大小寫
grep -B 數字:before顯示匹配行,和其上面n行
grep -A 數字:after顯示匹配行,和其下面n行
grep -C 數字:顯示匹配行,和上下n行
grep -e :實現多個選項間的邏輯or關系,例如grep -e 'cat' -e 'dog' filename
grep -w :匹配整個詞,用空格、特殊符號隔開的都算一個詞
grep -f 后面跟文件,文件中寫正則表達式,各個表達式相當於或關系
grep -f f1 f2 #兩個文件取交集
grep -E 使用egrep
grep -F 使用fgrep
PATTEN正則表達式:是一類字符所書寫出的模式(pattern)
元字符:不表示字符本身的意義,用於額外功能性的描述
基本正則表達式(grep)的元字符:
字符匹配:
.:元字符,代表任意一個字符,包括空格
\.:表示.本身,"\"斜桿是逃逸符后面可接, ! ` [ .
[ ]:指定范圍內的任意單個字符
[^]:指定范圍外的任意單個字符
[A-Z],[[:upper:]]所有大寫字母
[a-z],[[:lower:]]所有小寫字母,和通配符匹配文件名有區別
[[:alpha:]]所有字母,大小寫
[0-9],[[:digit:]]所有數字
[[:alnum:]]所有數字+字母
[[:blank:]]空白字符(空格和制表符)
[[:space:]]水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[^[:space:]]非空白字符
[[:graph:]]可打印的非空白字符
[[:print:]]可打印字符
[[:punct:]]標點符號
[[:cntrl:]]不可打印的控制字符(退格、刪除、警鈴)
次數匹配:用來指定匹配其前面的字符的次數
*:任意次
例如:x*y,xxy,xy,y,指的是x可以出現0,1或者多次
.*:匹配任意長度的任意字符
\?:0次或1次
例如:x\?y,xy,y,xxy
貪婪模式:盡可能的長的去匹配字符
\+:至少1次
\{m\}:匹配m次,此處的兩個\\是轉義字符
\{m,n\}:匹配至少M次,至多n次
\{m,\}:匹配至少M次
\{0,n\}:匹配至多n次
例如:x\{2,6\}y匹配xxy,xxxy,xxxxy,xxxxxy,xxxxxxy
位置錨定:用於指定字符出現的位置
^:錨定行首
$:錨定行尾
例如:^[[:space:]]\+$ 空白組成的行
\<char:錨定詞首,\bchar 數字、字母、下划線連起來的都算單詞,其他符號都算分隔符
char\>:錨定詞尾,char\b
例如: \<h..o\>,以h開頭,o結尾中間跟任意兩個字符的單詞
分組:
\(\)
\(ab\)*xy xy,abxy,ababxy
引用:
\1:后向引用,引用前面的第一個左括號以及與之對應的右括號中的模式的結果字符串
\2
\(a.b\)xy\1 a6bxya6b
或者:
\| a\|bcd a或者bcd,整個字符串或者
舉例:
1、顯示/proc/meminfo文件中以大小寫s開頭的行 # grep "^[Ss]" /proc/meminfo # grep -i "^s" /proc/meminfo 2、取出默認shell為非bash的用戶 # grep -v "bash$" /etc/passwd | cut -d: -f 1 3、取出默認shell為bash的且ID號最大的用戶 # grep "bash$" /etc/passwd | sort -t: -k3 -rn|head -1|cut -d: -f1 4、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,后面至少一個空白字符,而后至少一個非空白字符的行 # grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit 5、顯示/boot/grub/grub.conf中至少一個非空白字符開頭的行 # grep "^[^[:space:]]\{1,\}" /boot/grub/grub.conf 6、找出/etc/passwd文件中一位數或兩位數 # grep "\<[0-9]\{1,2\}\>" /etc/passwd 7、查看當前系統上root用戶的所有信息 # grep "^root\>" /etc/passwd 8、添加用戶bash和testbash、basher,而后找出當前系統上其用戶名和默認shell相同的用戶 # grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd 9、匹配所有非空白行 #grep "." a.txt 10、取目錄名 # grep -Eo ".*\<" # grep -Eo ".*[^/]" | grep -Eo ".*/" 11、取基名 # grep -Eo "[^/]+/?$" 12、匹配空行 # grep ^$ file 13、匹配非空行 # grep -v ^$ file 或 grep .\+ file 14、匹配0.0.0.0~255.255.255.255 grep --color=auto -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]\)\>" 15、匹配實際IP地址1.0.0.0-223.255.255.255 grep --color=auto -o "\<\([1-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-1][0-9]\|22[0-3]\)\>\(\.\<\([0-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)\>\)\{3\}"
egrep:使用擴展正則表達式來創建模式,相當於 grep -E
元字符:
字符匹配:
.:任意單個字符
[ ]:指定范圍內的任意單個字符
[^ ]:指定范圍外的任意單個字符
次數匹配:
*:匹配其前面的字符任意次
?:匹配前面的字符0或1次
+:匹配前面的字符至少1次
{m}:匹配前面的字符m次 區別於普通正則表達式
{m,n}:至少m,至多n次
{m,}:至少m次
{0,n}:至多n次
錨定
^:行首
$:行尾
\<, \b :詞首
\>, \b :詞尾
分組:
():分組