一、grep程序
1、Linux下有文本處理三劍客:grep sed awk
grep:文本 行過濾工具
sed : 文本行編輯器(流編輯器),改文件一般用sed
awk:報告生成器(做文本輸出格式化)
2、Grep
包含三個命令:它們是用來進行行匹配(pattern)匹配的
(1)grep的分類
grep
egrep = grep -E /使用擴展的正則表達式進行匹配
fgrep = fast grep //只使用文件通配符進行匹配
grep默認使用正則表達式進行文本匹配
(2)grep的用法
grep [option] … PATTERN [filename]
(3) grep的常見選項
-E 支持使用擴展的正則表達式(ERE)regexp
-P 使用perl語言的正則表達式引擎進行搜索(每種語言的正則表達式引擎搜索機制都不同,甚至sed grep awk使用的regexp引擎也不相同)
-i 忽略大小寫
-v 進行反選
-o 僅僅輸出匹配的內容(默認輸出的是匹配到的行)
--color=auto 語法着色
-n 顯示行號
二、PATTERN—正則表達式
作用:通過一些特殊字符,來表示一類字符內容,然后交給前面的命令來執行;如果使用他特殊字符本身含義,就需要\進行轉義
1、 字符匹配
. 代表任意一個字符 ?
[ ] 代表范圍內的任意一個字符
[^ ] 代表范圍外的任意一個字符
[0-9] [:digit:] [:alnum:][:alpha:][:upper:][:space:][:punct:]
2、 次數匹配
* 匹配前面的字符0到無數次
? 匹配前面的字符0到1次
+ 匹配前面的字符1到n次
\{m\} 匹配前面的字符m次
\{m,n\} 匹配前面的字符m到n次
\{m,\} 匹配至少m次
示例:[abc] + abbbbcccc
a\{7\} 匹配a7次,即aaaaaaa
\{0,n\} 匹配前面的字符0次到n次 【0次要不要】
3、 位置錨定
^ 錨定行首
$ 錨定行尾
\b 錨定詞首和錨定詞尾
\> 錨定詞尾
<\ 錨定詞首
示例:<\root\> //錨定單個單詞
4、 分組
分組特性:默認情況下,Linux系統會分為分組指定變量,變量的表示形式\1 \2 \3……
abc* ->abcccccc 此時我們需要把abc看成一個整體
\(\)
示例:\(abc\)* -> abcabcabc
\(ab+\(xy\)*\),其中\1=ab+\(xy\)*,\2=xy
三、練習
1、顯示/proc/meminfo文件中大小寫s開頭的行
grep -i "^s" /proc/meminfo
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd
3、顯示/etc/passwd文件中UID號最大的用戶的用戶名
sort -n -t:-k3 /etc/passwd | tail -1 |cut -d:-f1
4、如果用戶root存在,顯示其默認的shell程序
grep "^root\>" /etc/passwd &> /dev/null && grep "root\>" /etc/passwd |cut -d: -f7
id root &> /dev/null && grep "^root\>" /etc/passwd |cut -d: -f7
5、找出/etc/passwd中的兩位或三位數
grep "[0-9]\{2,3\}" /etc/passwd
6、顯示/etc/rc.d/rc/sysinit文件中,至少以一個空白字符開頭的且后面為非空白字符的行
grep "^[[:space:]]\+.*[^[:space:]]$" /etc/rc.d/rc.sysinit
7、找出"netstat -tan"命令的結果中,以"LISTEN"后跟0、1或多個空白字符結尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin):而后找出/etc/passwd文件中用戶名同shell名的行
useradd bash
useradd testbash
useradd basher
useradd -s /sbin/nologin nologin
grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd