一、grep程式 Linux下有文本處理三劍客:grep、sed、awk grep:文本 行過濾工具 sed:文本 行編輯器(流編輯器) awk:報告生成器(做文本輸出格式化) 1、grep grep包含三個命令:grep、egrep、fgrep,他們是用來進行 行模式(patten)匹配的 egr ...
一、grep程式
Linux下有文本處理三劍客:grep、sed、awk
grep:文本 行過濾工具
sed:文本 行編輯器(流編輯器)
awk:報告生成器(做文本輸出格式化)
1、grep
grep包含三個命令:grep、egrep、fgrep,他們是用來進行 行模式(patten)匹配的
egrep == grep -E
fgrep == fast grep
grep預設使用正則表達式進行文本匹配
2、grep的用法
grep [option]… PATTEN [filename]
3、grep的常見選項
-E 支持使用擴展的正則表達式(regexp)
-P 使用perl語言的正則表達式引擎進行搜索(每一種語言的正則表達式引擎都不相同,甚至sed grep awk 使用的regexp引擎也不相同)
-i 忽略大小寫
-v 進行反選
-o 僅僅輸出匹配的內容(預設輸出匹配到的行
--color=auto 語法著色
-n 顯示行號
-w 匹配固定的單詞
4、PATTEN—正則表達式
作用:通過一些特殊字元,來表示一類字元內容,交給前面的命令來執行;如果使用特殊字元本身含義就需要使用 \ 進行轉義
a) 文件通配符: * ? [ ] [^ ]
b) 字元匹配:
. 任意一個字元
[ ] 範圍內的任意一個字元
[^ ] 範圍外的任意一個字元
字元類:
[:alnum:] 字母+數字
[:alpha:] 字母
[:upper:] 大寫字母
[:lower:] 小寫字母
[:digit:] 數字
[:punct:] 表示特殊字元
[:space:] 空格 ^[[:space:]]*$ 有空格鍵的空行
c) 次數匹配
* 匹配前一個字元0次到多次 .*表示任意長度的任意字元
\? 匹配前一個字元0次到1次
\+ 匹配前一個字元1次到n次
\{m\} 匹配前一個字元m次 a\{7\} == aaaaaaa
\{m,n\} 匹配前一個字元m到n次
\{0,n\} 匹配前一個字元0到n次
\{m,\} 匹配前一個字元至少m次
d) 位置錨定
^ 錨定行首
$ 錨定行尾
\b 錨定詞首和錨定詞尾
\> 錨定詞尾
\< 錨定詞首
e) 分組 分組的特性:預設情況下,Linux系統會為分組指定變數,變數的表示形式為\1 \2 \3 …
\(\) 實例: \(abc\) 把abc看成一個整體匹配
練習:
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 /bin/bash useradd testbash useradd basher useradd -s /sbin/nologin nologin grep "\(^[[:alnum:]]\+\>\).*\1$" /etc/passwd