Linux入門之文本處理三劍客之grep
文本處理工具:
grep,sed(流編輯器),awk
grep簡述及特點
簡介:全局搜索正則表達式出來的行并打印 (Global search REgular expression and Print out the line),一種按照特定模式(pattern)的文本過濾工具
模式:pattern,通過有正則表達式(refexp)特殊字符以及文本字符組成的條件來過濾
正則表達式:refexp,有一些bash支持的特殊文本字符來表示特殊含義,如果特殊字符當原本字符匹配需要轉義
正則表達式一般分兩類
基本正則表達式: BRE
擴展正則表達式: ERE
grep 命令基本語法
grep [option] [refexp] file
–color 用特定的顏色高亮顯示模式中匹配的字符串,一般為紅色
-v 顯示不被模式PATTERN匹配的行
-o 表示只顯示被模式匹配的字符,而不是整個行
-q 靜默模式不輸出信息
-A # after 顯示到匹配到的后 # 行
-B # before 顯示到匹配的前 # 行
-C # context 顯示匹配的前后各幾行
-E 使用擴展正則表達式
(基本和擴展的功能類似,只是轉義方式不同)
基本正則表達式:
字符匹配
. : 任意單個字符
? : 匹配其前單個字符0或1次
* : 匹配其前單個字符任意次
.* : 匹配任意長度的任意字符
[] : 表示匹配[]里的字符集,[ab]及包含a或b的字符
[^]: 表示匹配除了[]里的其它任意字符,[^ab]及不包含a或b的字符
[]里同樣支持特殊通配符:
[0-9] 表示單個0到9的數字
[:digit:] 表示所有數值,同上
[a-z] [:lower:] 表示單個小寫字母
[A-Z] [:upper:] 表示單個大寫字母
[:alpha:] [a-zA-Z] 表示單個字母
[:alnum:] 表示字母或數字
[:space:] 匹配空格
[:punct:] 表示所有標點符合
注意:在使用中,[::]這種格式[::]里帶特殊單詞的需要再加[]來表示,比如匹配空格則為'[[:space:]]'
次數匹配
\? : 0次或1次
\+ : 匹配其前字符一次以上
\{m\} :匹配其前字符m次
\{m,\} : 匹配其前字符至少m次
\{m,n\} :匹配其前字符至少m次,至多n次
字符錨定
^ : 行首錨定
$ : 行尾錨定
^$ : 表示空行匹配
\< 或 \b: 行首錨定
\> 或 \b: 行尾錨定
\<PATTERN\> 錨定匹配PATTERN的作為單詞 \<root\> \broot\b
\(\) : 對()里匹配PATTERN的做分組
\1為后項引用前面第一個分組
擴展正則表達式:
用法
grep -E 'PATTERN' [file]
egrep 'PATTERN' [file]
字符匹配和基本相同
[] [^] [[::]] 用法一樣
次數匹配
* 匹配前面字符任意次
? 0或1次
+ 1次以上
{m} 匹配多少次
{m,} 至少m次
{m,n} 只是m次,至多n次
{0,n} 至多n次
錨定和基本用法一樣
分組直接使用(),不要用\轉義
后項引用 \1 \2 \3
擴展的功能:
或者
(c|C)at : cat后者Cat
(root|tom|user1)
練習1
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式) grep -i '^s' /proc/meminfo grep '^[Ss]' /proc/meminfo grep -E '^(s|S)' /proc/meminfo 2、顯示/etc/passwd文件中不以/bin/bash結尾的行 grep -v '/bin/bash$' /etc/passwd 3、顯示用戶rpc默認的shell程序 grep '^\<rpc\>' /etc/passwd | cut -d: -f7 4、找出/etc/passwd中的兩位或三位數 grep '\<[0-9][0-9]\?\>' /etc/passwd grep '\<[0-9]\{2,3\}\>' /etc/passwd 5、顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行 grep '^[[:space:]]\+.*[^[:space:]]' /etc/grub2.cfg 6、找出"netstat -tan"命令的結果中以'LISTEN'后跟任意個空白字符結尾的行 netstat -tan '.*LISTEN[[:space:]]*$' 7、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行 grep '^\<\(.*\)\>.*/\1$' /etc/passwd grep '^\<\(.*\)\>.*\<\1\>$' /etc/passwd
練習2
1、顯示當前系統root、mage或wang用戶的UID和默認shell grep -E '^(root|mage|wang)\>' /etc/passwd |cut -d: -f7 2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行 grep -E -o '^\<[[:alnum:]_]+\>\(\)' /etc/rc.d/init.d/functins 3、使用egrep取出/etc/rc.d/init.d/functions中其基名 echo "/etc/rc.d/init.d/functions" grep -E -o '[^/]+/?$' 4、使用egrep取出上面路徑的目錄名 echo "/etc/rc.d/init.d/functions" | grep -E '/.*/' 5、統計以root身份登錄的每個遠程主機IP地址的登錄次數 last | grep -o 'root\>.*\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]' | tr -s ' '| cut -d' ' -f3 | uniq -c v6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255 grep -E '\<([0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>' v7、顯示ifconfig命令結果中所有IPv4地址 ifconfig | grep -o '\(\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)'
原創文章,作者:ailisa5520,如若轉載,請注明出處:http://www.www58058.com/30111