Linux的哲學思想一切皆文件(包括硬件);使用文本文件保存程序的配置數據;掌握一種強大的文本搜索工具將是linux運維人員的的必備技能,grep全稱 (Globel Search REgular Expression and Printing out the line)全局搜索正則表達式並匹配到的行打印出來)是Linux系統中一種強大的文本搜索工具,能根據用戶指定的文本模式(正則表達元字符以及正常字符組合而成)對目標文件進行逐行搜索,並把匹配到的顯示到屏幕;不影響原文件內容;grep家族包括 有grep、egrep和fgrep(fgrep:不支持正則表達式;搜索速度更快)。 egrep表示擴展的grep,比grep支持更多的元字符,
grep 使用格式:
grep [OPTIONS] PATTERN [FILE...]
grep 選項 模式 文件
#grep 在搜索的模式中含有空白字符必須使用引號;單引和雙引號都可以;grep模式中如果包含變量的時候必須加雙引號
grep 常用選項
--color[=WHEN], --colour[=WHEN] : 搜索到匹配的文本時進行語法着色,可將grep --color=auto 定義爲alias
--color=auto : 自動爲語法着色
例子:grep --color=auto "root" /etc/passwd
-o: 只顯示被模式匹配到的內容,而不是整個行
-i: ignore case,匹配時不區分字符大小寫
-v: 反向選取,顯示不能夠被模式匹配到的行
-E:使用擴展的正則表達式
-A #:匹配到的行時,並顯示該行後面的#行(#表示數值)
-B #:匹配到的行時,並顯示該行前面的#行(#表示數值)
-C # 匹配到的行時,並顯示該行前後的各#行(#表示數值)
正則表達式:REGular EXPression REGEXP
正則表達式是什麼? 正則表達又一些是由元字符及正常字符所書寫的模式,其中的元字符不表示字符本身的意義,而是用於表達控制或通配等功能;這就是grep的搜索模式(Pattern)做爲過濾文本的條件。
正則表達式分爲:
基本正則表達式 : grep
擴展正則表達式: grep -E, egrep
基本正則表達式元字符:
字符匹配:(通常只用於匹配單個字符)
. : 匹配任意單個字符
[] : 匹配指定範圍內的任意單個字符
[^] : 匹配指定範圍外的任意單個字符
[0-9], [[:digit:]] : 所有數字
[^0-9], [^[:digit:]] : 出數字以外的其他字符
[a-z], [[:lower:]] :所有的小寫字母
[A-Z], [[:upper:]] :所有的大寫字母
[a-zA-Z], [[:alpha:]] :所有的字母
[0-9a-zA-Z], [[:alnum:]] : 所有的數字和字母
[[:space:]] : 空白字符
[[:punct:]] : 所有標點符號
顯示 /etc/rc.d/rc.sysinit 文件中,以大寫C或c後面跟了a的行
# grep '[cC]a' /etc/rc.d/rc.sysinit
顯示 /etc/rc.d/rc.sysinit 文件中,以大寫N或小寫n後面跟任意單個字符的行
# grep '[Nn].' /etc/rc.d/rc.sysinit
顯示 /etc/rc.d/rc.sysinit 文件中,以大寫N或小寫n後面跟一個非字母的行
# grep '[Nn][^[:alpha:]]' /etc/rc.d/rc.sysinit
次數匹配:在期望匹配字符後面提供一個控制符,用於表達匹配其前面字符指定的次數
* : 匹配其前字符任意長度,表示0次、1次或多次;
.* : 任意長度的任意字符;此時工作於貪婪模式(儘可能長的匹配)
\? :匹配其前字符0次或1次;(表示其左側字符可有可無)
\+ : 匹配其前字符1次或多次;(表示其左側字符至少出現1次)
\{m\} :表示其前字符精確出現m次;
\{m,n\} :其前字符至少出現m次,最多出現n次;
\{0,n\} :其前字符至多出現n次;
\{m,\} :其前字符至少出現m次
顯示/etc/passwd中,roo後跟了t,t只出現0次或一次的行
# grep "root\?" /etc/passwd
顯示/etc/passwd中,r後跟了o後跟了t,o至少出現1次的行
# grep "ro\+t" /etc/passwd
顯示/etc/passwd中,r後跟了o,o只出現2次的行
# grep --color "ro\{2\}" /etc/passwd
顯示/etc/passwd中,r後跟了o,o出現至少1次至多2次的行
# grep --color "ro\{1,2\}" /etc/passwd
位置錨定:
^: 錨定行首;使用格式:^WORD
$: 錨定行尾;使用格式:WORD$
^PATTERN$:用模式來匹配整行;
^$ : 匹配空白行(空白行不等同於空白字符行);
單詞錨定 :由非特殊字符組成的連續的字符串
\< :錨定詞首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
\> :錨定詞尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
\<PATTERN\>:匹配PATTERN能匹配到的整個單詞
分組:\(\)
注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符,可以被grep記憶(保存於內置的變量中,這些變量是\1, \2, ...),因此,還可以被引用;
\1: 引用,模式中自左向右,由第一個左括號以及與之對應的右括號中的模式所匹配到的內容;
\2: 引用 ,模式中自左右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容
顯示/etc/passwd文件,以sh開頭的行
# grep "^sh" /etc/passwd
顯示/etc/passwd文件,以sh開頭中間跟了任意字符後以sh結尾的行
# grep "^sh.*sh$" /etc/passwd
顯示/etc/rc.d/rc.sysinit 文件,以空白字符開頭,空白字符出現任意次的行
# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit
顯示/etc/rc.d/rc.sysinit 文件,空白行(行中不包含任意字符的行)
# grep "^$" /etc/rc.d/rc.sysinit
顯示/etc/passwd文件,以sh作爲單詞詞首的行
# grep "\<sh" /etc/passwd #等同於 # grep "\bsh" /etc/passwd
顯示/etc/passwd文件,以sh作爲單詞詞尾的行
# grep "sh\>" /etc/passwd #等同於 # grep "sh\b" /etc/passwd
從ifconfig命令結果中取得兩位的數字
# ifconfig | grep "\<[[:digit:]]\{2\}\>"
顯示/etc/rc.d/rc.sysinit 文件中以大寫N或小寫n後面了跟了任意個非字母的行
# grep "[Nn][^[:alpha:]]*" /etc/rc.d/rc.sysinit
顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式;
# grep "^[sS]" /proc/meminfo # grep -i "^s" /proc/meminfo
顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的用戶;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
顯示/etc/passwd文件中其默認shell爲/bin/bash的用戶;
# grep "/bin/bash$" /etc/passwd | cut -d: -f1
找出/etc/passwd文件中的一位數或兩位數;
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
# grep "^[[:space:]]\+" /boot/grub/grub.conf
顯示/etc/rc.d/rc.sysinit文件中以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行;
# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit
打出netstat -tan命令執行結果中以‘LISTEN’,後或跟空白字符結尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
添加用戶bash, testbash, basher, nologin (此一個用戶的shell爲/sbin/nologin),而後找出當前系統上其用戶名和默認shell相同的用戶的信息;
# useradd -s /sbin/nologin nologin <--指定nologin用戶的默認shell 爲/sbin/nologin # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd # grep "^\(.*\):.*\1$" /etc/passwd
擴展的正則表達式:
字符匹配:(和基本正則表達式表示的含義一直)
. : 匹配任意單個字符
[] :匹配指定範圍內的任意單個字符
[^] :匹配指定範圍外的任意單個字符
次數匹配:
*: 匹配其前字符任意長度,表示0次、1次或多次;
?:匹配其前字符0或1次
+: 匹配其前字符至少1次
{m}:精確匹配匹配其前字符m次;
{m,n}:匹配其前字符至少m次,至多次;
{m,}:匹配其前字符至少m次;
位置錨定:
^ :錨定行首;使用格式:^WORD
$ :錨定行尾;使用格式:WORD$
\<, \b :錨定詞首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
\>, \b :錨定詞尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
分組:\(\)
注意:分組中的模式,在某次的具體匹配過程中所匹配到的字符,可以被grep記憶(保存於內置的變量中,這些變量是\1, \2, ...),因此,還可以被引用;
\1: 引用,模式中自左向右,由第一個左括號以及與之對應的右括號中的模式所匹配到的內容;
\2: 引用 ,模式中自左右,由第二個左括號以及與之對應的右括號中的模式所匹配到的內容
或者:
a|b:a或者b
或者是匹配|兩側的所有內容;
支持擴展的正則表達式命令:grep -E PATTERN FILE... ;egrep PATTERN FILE...
使用echo命令輸出一個絕對路徑,使用grep取出其基名;
擴展:取出其路徑名
# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1
找出ifconfig命令結果中的1-255之間數字;
# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
寫一個模式,能匹配合理的IP地址;
1.0.0.1 -- 239.255.255.255
# grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" # grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" ip.txt