1、grep程序git
一、Linux下有文本處理三劍客:grep sed awk正則表達式
grep:文本 行過濾工具shell
sed : 文本行編輯器(流編輯器),改文件通常用sedbash
awk:報告生成器(作文本輸出格式化)編輯器
二、Grep工具
包含三個命令:它們是用來進行行匹配(pattern)匹配的spa
(1)grep的分類regexp
grepit
egrep = grep -E /使用擴展的正則表達式進行匹配io
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 顯示行號
2、PATTERN—正則表達式
做用:經過一些特殊字符,來表示一類字符內容,而後交給前面的命令來執行;若是使用他特殊字符自己含義,就須要\進行轉義
一、 字符匹配
. 表明任意一個字符 ?
[ ] 表明範圍內的任意一個字符
[^ ] 表明範圍外的任意一個字符
[0-9] [:digit:] [:alnum:][:alpha:][:upper:][:space:][:punct:]
二、 次數匹配
* 匹配前面的字符0到無數次
? 匹配前面的字符0到1次
+ 匹配前面的字符1到n次
\{m\} 匹配前面的字符m次
\{m,n\} 匹配前面的字符m到n次
\{m,\} 匹配至少m次
示例:[abc] + abbbbcccc
a\{7\} 匹配a7次,即aaaaaaa
\{0,n\} 匹配前面的字符0次到n次 【0次要不要】
三、 位置錨定
^ 錨定行首
$ 錨定行尾
\b 錨定詞首和錨定詞尾
\> 錨定詞尾
<\ 錨定詞首
示例:<\root\> //錨定單個單詞
四、 分組
分組特性:默認狀況下,Linux系統會分爲分組指定變量,變量的表示形式\1 \2 \3……
abc* ->abcccccc 此時咱們須要把abc當作一個總體
\(\)
示例:\(abc\)* -> abcabcabc
\(ab+\(xy\)*\),其中\1=ab+\(xy\)*,\2=xy
3、練習
一、顯示/proc/meminfo文件中大小寫s開頭的行
grep -i "^s" /proc/meminfo
二、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd
三、顯示/etc/passwd文件中UID號最大的用戶的用戶名
sort -n -t:-k3 /etc/passwd | tail -1 |cut -d:-f1
四、若是用戶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
五、找出/etc/passwd中的兩位或三位數
grep "[0-9]\{2,3\}" /etc/passwd
六、顯示/etc/rc.d/rc/sysinit文件中,至少以一個空白字符開頭的且後面爲非空白字符的行
grep "^[[:space:]]\+.*[^[:space:]]$" /etc/rc.d/rc.sysinit
七、找出"netstat -tan"命令的結果中,以"LISTEN"後跟0、1或多個空白字符結尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
八、添加用戶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