正則表達式:Regular Expression REGEXP
由一類特殊字符及文本字符所編寫的模式,表示控制或通配的功能
兩類:
基本正則表達式BRE:
擴展正則表達式ERE:
*** grep GLoble search Regular exression and Print out the line
文本過濾(一定模式pattern)2
-v 反向匹配 顯示未匹配到的行
-e 實現多個選項間的邏輯or關系
-o 僅顯示匹配到的字符本身 而不是整行
-n 顯示匹配的行號
-c 統計匹配的行數
-w 匹配單詞
-E 支持擴展正則表達式 egrep
-i 忽略字符大小寫
-q –quiet 靜默模式,不輸出任何信息 可用$?查看命令執行情況
-A# :after 顯示匹配行及其前#行
B# :before 匹配行及其后#行
C# :context 匹配行及其前后#行
1.基本正則表達式元字符:
. 任意 單個字符
* 前面字符 任意次 可以不出現 0 – ∞
.* 任意長度 任意字符
\? 其前面字符 0次或一次 可有可無
\+ 其前面字符 1次或多次
\{m,n\} 其前面字符m至n次
\{m\} 指定出現m次 \{,n\} 至多n次
[] 指定范圍內任意單個字符
[^] 指定范圍外的任意單個字符
數字:[:digit:],小寫字母[:lower:],大寫字母[:upper:],字母[:alpha:],
字母數字[:alnum:],標點[:punct:],空格[:space:]
2.位置錨定:
^ 行首錨定,整個模式最左側
$ 行尾錨定,整個模式最右側
^pattern$ 用patt匹配整行
^$ 空白行 不可包含空格
^[[:space:]]*$ 空白行或包含任意空格的行
\<或\b 詞首錨定
\>或\b 詞尾錨定
\<pattern\>匹配完整單詞
3.分組及引用:
\(\) 括號內的字符作為一組 \(xy\)\+ 一個或多個xy 括號可嵌套不可交叉
可用\1 \2 \3 …引用對應分組
*** 擴展正則表達式: 部分字符區別grep 不用加"\"
egrep => grep -E
1.擴展正則表達式的元字符:
.
[]
[^]
2.次數匹配: 不用加轉義字符 "\"
*
?
+
{m}
{m,n}
3.位置錨定:
^
$
\<,\b
\>,\b
4.分組及引用:
()
后向引用:\1 \2 \3 …
5.或:
a|b a或者b ; z|Zjj z或Zjj ; (z|Z)jj zjj或Zjj
例 匹配1到255
egrep -o '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\>'
例 passwd 用戶名與shell相同的行
egrep "^([^:]+\>).*\1$" /etc/passwd
例 簡單 過濾出ip地址 不嚴謹
egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
===練習:grep
1.顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
#grep -i "^s" /proc/meminfo
#grep "^[sS]" /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 -o "[[:digit:]]\{2,3\}" /etc/passwd
5.顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面存非空白字符的行
#grep "^[[:space:]]\+[^[:space:]].*" /etc/grub2.cfg
6.找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行
#netstat -tan|grep "\<LISTEN[[:space:]]*$"
7.添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行
#egrep "^([^:]+\>).*\1$" /etc/passwd
===練習:egrep
1.顯示當前系統root、mage或wang用戶的UID和默認shell
#egrep "^(root|mage|wang)" /etc/passwd|cut -d: -f3,7
2.找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
#grep "^[[:alnum:]_]*\>()" /etc/rc.d/init.d/functions
3.使用egrep取出/etc/rc.d/init.d/functions中其基名
#echo "/etc/rc.d/init.d/functions"|grep -o "[^/]*$"
4.使用egrep取出上面路徑的目錄名
#echo "/etc/rc.d/init.d/functions"|egrep -o "^.*/"
5.統計以root身份登錄的每個遠程主機IP地址的登錄次數
#who|grep "root"|grep -o "(.*)"|uniq -c
不支持正則表達式元字符:
fgrep: fast grep
用不到元字符時 fgrep更快
===常用工具:
#cat [OPTION]… [FILE]…查看文件內容 tac:從行尾開始顯示 rev:每行字符倒敘顯示
-A:顯示所有控制符
-n: 對每一行進行編號
-b:非空行編號
-s:壓縮連續的空行成一行
-E: 顯示行結束符$
#more [OPTIONS…] FILE… 分頁查看文件
-d: 顯示翻頁及退出提示
#less 分頁查看文件 可回看
#head [OPTION]… [FILE]… 顯示文件前幾行 默認10行
-c #: 指定獲取前#字節
-n #: 指定獲取前#行
-#:指定行數
#tail [OPTION]… [FILE]… 顯示文件最后幾行 默認10行
-#:
-f: 跟蹤顯示文件新追加的內容,常用日志監控
-c #: 指定獲取后#字節
-n #: 指定獲取后#行
tail -n0 -f FILE $
paste [OPTION]… [FILE]… 合并兩個文件同行號的列到一行
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
paste f1 f2
paste -s f1 f2
#wc word count 單詞統計 常和管道|一起使用
-l 統計行數
-w 單詞數
-c 字節數
-m 字符數
cut 從文件中的某些行剪切片段
-d 以指定的 字符作為 分隔符, 可以不加空格直接加字符 -d# 井號為分隔符
-f 顯示出指定字段 -f3 #:單個字段 #-#:連續多個字段 #,#離散的多個字段
-c 按字符切割
–output-delimiter=STRING指定輸出分隔符 默認":"
#sort 排序
-n 以數值 大小進行排序
-tCHAR 指定分隔符
-k# 設置比較字段 -t: -k3 冒號為分隔符 第3個字段
-r 逆序 排序
-f 忽略字符大小寫
-u 重復的行保留一份 連續相同為重復
#uniq 報告或移除重復的行 配合sort 統計重復出現次數
-c 統計 每行重復次數
-u 只顯示 無重復的行
-d 僅顯示 有重復的行
#diff 逐行比較兩個文件的不同 可制作補丁文件patch
diff file.old file.new
-u 輸出“統一的(unified)”diff格式文件,適用于補丁文件
diff /oldpath /newpath>/patchfile 制作補丁 把diff命令結果重定向
$diff -u foo.conf-broken foo.conf-works>foo.patch
$patch -b foo.conf-broken foo.patch
patch 打補丁
-b選項來自動備份改變了的文件
patch[OPTIONS] -i (指定補丁文件) /patchfile /oldpath
patch /oldpath</patchfile
===練習:cut sort tr head tail uniq
1、找出ifconfig命令結果中本機的所有IPv4地址
#ifconfig|head -2|tail -1|cut -d: -f2|cut -d" " -f1
2、查出分區空間使用率的最大百分比值
#df|tr -s " " ":" |cut -d: -f5|sort -nr|head -1
3.查出用戶UID最大值的用戶名、UID及shell類型
#sort -nrt: -k3 /etc/passwd|head -1|cut -d: -f1,3,7
4.查出/tmp的權限,以數字方式顯示
#stat /tmp|head -4|tail -1|cut -d "(" -f2|cut -d "/" -f1
5.統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序
#netstat -nt|tr -s " " ":"|cut -d: -f6|uniq -c|sort -nr
原創文章,作者:Jasper,如若轉載,請注明出處:http://www.www58058.com/29031