終于又到了一周一篇博客的日子
在這學習已經三周了,慢慢養成了寫博客的好習慣,也慢慢的懂得了怎么寫博客。這周給我印象最深刻的就是正則表達式,原本打算要寫前幾天所學的內容,但是昨天學到正則表達式讓我有點懵,所以我今天會用一天的時間去給大家詳細講解正則表達式,爭取讓那些和我一樣困解的人能夠豁然開朗,也正是因為正則表達式才激起了我學習的勁頭。
一、grep 文本過濾工具(截取關鍵字的那一行)
grep root /etc/passwd
grep “$USER” /etc/passwd
– -color=auto 將匹配的結果著色顯示 (centos6里面在alias加入alias grep=’grep – -color=auto’就可以,centos7默認有)
-v 反向匹配 顯示除了你輸入的關鍵字
-i 忽略大小寫
-n 顯示的結果前增加行號
-c 僅顯示匹配到結果的行數
-o 僅顯示匹配到的字符串
-q 靜默模式,不輸出任何信息 (腳本里面用的多) echo $?可以查看出入的結果正確還是錯誤 或者 &> /dev/null
-A# 顯示搜索關鍵字的后幾行
-B# 顯示搜素關鍵字的前幾行
例子:nmap -v -sP 172.17.252.0/24 |grep -B1 “Host is up”|grep for |cut -d” ” -f5 |wc -l 查看當前哪些主機在運行
-C# 顯示關鍵字向前#行,當前行,及向后#行
-e 關鍵字1 -e 關鍵字2 顯示關鍵字1和關鍵字2的行
-w 匹配整個單詞
-E 使用擴展正則表達式 或egrep
-F 不使用正則表達式 或 fgrep
二、正則表達式(是由一類特殊字符以及文本字符所編寫的模式,其中有些元字符不表示字面意思,而表示控制或通配的功能)
元字符分類:(1)字符匹配
(2)匹配次數
(3)位置錨定
(4)分組
(1)字符匹配
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 或 [0-9a-zA-Z]
[:alpha:] 或 [a-zA-Z]
[:upper:] 或 [A-Z]
[:lower:] 或 [a-z]
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)
[:digit:] 十進制數字 或[0-9]
[:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
(2)匹配次數(用在指定次數的字符后面,用于指定前面的字符要出現的次數)
* 表示匹配前面字符任意次,包括0或者無限次
.* 表示所有,任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次 (需要用’’引起來)
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次 (重復至少m次最多n次)
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
(3)位置錨定(定位出現的位置)
^ 以后面內容為首
$ 以前面內容為尾
^$ 表示空行
\< (開始符) 或 \b 詞首錨定,開始與關鍵詞
\> (結束符)或 \b 詞尾錨定;結束于關鍵詞
\<PATTERN\> 匹配整個單詞,或者字段
(4)分組
\(\)將一個字符或者多個字符捆綁在一起 進行搜索
\(a\).*\1 表示一行以a開頭的關鍵字,中間是任何內容,再以a結束的關鍵字
\| 表示或 與 grep -e 一樣
cat /etc/httpd/conf/httpd.conf |grep -ve “^$” -e “^#”
cat /etc/httpd/conf/httpd.conf |grep -v “^$\|^#” (centos6中)大家可以試一下,因為太長沒有辦法截圖
三、練習(針對以上內容做幾道練習題鞏固鞏固)
1、 顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩 種方法)
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
3、顯示用戶rpc默認的shell程序
4、找出/etc/passwd中的兩位或三位數
(注釋:如果不加\< \>的話多位也會顯示)
5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白 字符開頭的且后面存非空白字符的行
6、找出“netstat -tan”命令的結果中以‘LISTEN’后跟任意多個空白字符結尾的行
7、顯示CentOS7上所有系統用戶的用戶名和UID
如果不加最后面 grep -v root 則root也會別列出在內,因為系統用戶是1-999
8、添加用戶bash、testbash、basher、sh、nologin(其shell 為/sbin/nologin),找出/etc/passwd用戶名同shell名的行
四、egrep =grep -E
擴展正則表達式與正則表達式不同地方為有些地方可以省略\ 但是與grep需要加\相同的地方是:\<, \b :語首 \>, \b :語尾 后向引用:\1, \2
五、練習(針對egrep)
1、 顯示三個用戶root、mage、wang的UID和默認shell
2、使用egrep取出/etc/rc.d/init.d/functions中其基名
3、利用擴展正則表達式分別表示0-9、100-199、 200-249、250-255
echo {0..255}|egrep -o “\<[0-9]{3}\>” |egrep -o “^1[0-9]{2}” 或者echo {0..255} |egrep -o “\<[0-9]{3}\>” |egrep “^1” 顯示100~199
echo {0..255} |egrep -o “\<[0-9]{3}\>” |egrep “^2[0-4]{1}” 顯示200~249
以上就是我對文本處理三劍客之一grep的簡單理解,希望能夠幫住到大家。
我想再強調一點就是寫博客是個記憶深刻的很好的方法,希望大家能夠堅持下去!
原創文章,作者:In summer,如若轉載,請注明出處:http://www.www58058.com/83139