linux 上文本處理三劍客:
grep ,egrep, fgrep:文本過濾工具(模式:pattern);
grep:基本正則表達式 -E支持擴展 ,-F
egrep:擴展正則表達式 -G支持基本 -F
fgrep: 不支持正則表達式
sed:steam editor, 流編輯器;文本編輯工具;
awk:linux上的實現為gawk,文本報告生成器(格式化文本);
正則表達式:Regual Expression,REGEXP
由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用于表示控制或通配的功能;
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
元字符:\(hello[[:space:]]\+\)\+
grep:Global search REgular expression and print out the line.
作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文件逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式的元字符所編寫的過濾條件
正則表達式引擎:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
--color=auto:對匹配到的文本著色后高亮顯示
-i:ignorecase,忽略字符的大小寫;
-o:僅顯示匹配到的字符本身
-v:--invert-match:顯示不能被匹配的行
-E:支持使用擴展的正則表達式字符
-q:--quiet, --silent:靜默模式,即不輸出任何信息
-A#after,后#行
-B#before,前#行
-C#context,前后#行
基本正則表達式元字符:
字符匹配:
.:匹配任意單個字符
[]:匹配指定訪問內的任意單個字符
[^]匹配指定訪問外的任意單個字符
[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次數:用在要指定其出現的次數的字符的后面,用于限制其前面字符出現的次數;默認工作于貪婪模式
*:匹配其前面的字符任意次:0,1,多次
.*:配置任意長度的任意字符
\?:匹配其前面的字符0次或1次,即其前面的字符是可有可無
\+:匹配其前面的字符1次或多次;即前面的字符要出現至少1次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次
位置錨定:
^:行首錨定;用于模式的最左側;
$:行尾錨定;用于模式的最右側;
^PATTERN$:用于PATTERN來匹配整行
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行
單詞:非特殊字符組成的連續字符(字符串),都稱為單詞
\<或\b:詞首錨定,用于單詞模式的左側
\>或\b:詞尾錨定,用于單詞模式的右側
\<pattern\>:匹配完整 單詞
練習:1、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "\/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中兩位數或者三位數
grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.syinit或/etc/grub.cfg文件 中,以至少一個空白字符開頭,且后面非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/grub.conf
4、找出“netstat -tan”命令的結果中以LISTEN后跟0、1或多個空白字符結尾的行;
netstat -tan | grep "LISTEN[[:space:]]*$"
分組及引用:
\(\):將一個或多個字符捆綁在一起
\(xy\)*ab
Note:分區括號中的模式匹配到的內容會被正則表達式引擎自動記錄與內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配的字符
\3:
...
grep "\(r..t\).*\1" /etc/passwd
后向引用:引用前面的分組括號中的模式所匹配到的字符;
egrep:
支持擴展的正則表達式實現類似于grep文本過濾功能:grep -E
egrep [OPTIONS] PATTERN [FILE...]
選項-i,-o,-v,-q,-A,-B,-C
-G:支持基本正則表達式
擴展正則表達式的元字符:
字符匹配:
.:任意單個字符
[]:指定訪問內的任意單個字符
[^]: 指定訪問外的任意單個字符
次數匹配:
*:任意次,0,1,多次
?:0次或1次,其前的字符是可有可無的
+:其前字符至少1次
{m}: 其前的字符m次
{m,n}至少m次,至多n次
{0,n}
{m,}
位置錨定:
^:行首錨定
$:行尾錨定
\<,\b詞首錨定
\>,\b詞尾錨定
分組及引用:
():分組;括號內的模式匹配到的字符會被記錄于正則表達式引擎內部變量中;
后向引用:\1,\2,\3
或:
a|b :a或者b
C|cat:C或者cat
(C|c)at:C或者c
練習:
1、找出/proc/meminfo文件中,所有大寫或小寫s開頭的行;至少有三種實現方式。
grep "^[Ss]" /proc/meminfo
grep -i "^s" /proc/meminfo
grep -E "^(S|s)" /proc/meminfo
2、顯示目前系統上root、centos或user1用戶的相關信息
grep -E "^root|mysql|user3\>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一個小括號的行
grep -E "[^[:punct:]]+\(\)" /etc/rc.d/init.d/functions
grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4、使用echo命令輸出一絕對路徑,使用egrep取出其名
echo /www/mysql_data/mysql-bin.000001/ | grep -E -o "[^/]+/?$"
進一步;取其路徑名;類似于對其之星dirname的結果。
5、找出ifconfig命令結果中的1-255之間的數值
ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6、課外作業:找出ifconfig命令結果中的IP地址
ifconfig eth0 | awk '/Mask/{split($2,ip,":");print ip[2]}'
ifconfig eth0 | cut -d: -f2 | awk '(NR==2){print $1}'
7、添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名為同shell名的行
grep -E "(^[^:]+\>).*\1$" /etc/passwd
fgrep:不支持正則表達式元字符;
當無需要用到元字符去編寫模式時,使用fgrep性能更好
文本查看及處理工具:wc , cut ,sort , uniq ,diff ,patch
wc:word count
wc [OPTION]... [FILE]...
-l:lines
-w:words
-c:bytes
cut:
cut OPTION... [FILE]...
OPTION
-d CHAR:為指定的字符為分隔符
-f FIELDS:挑選出的字段
#:指定的單個字段
#-#:連續的多個字段
#,#:離散的多個字段
sort:
sort [OPTION]... [FILE]...
-n :基于數值大小排序
-t CHAR:指定分隔符;
-k #:用于排序比較的字段
-r:逆序排序
-f:忽略字符大小寫
-u:重復的行只保留一份
重復行:連續且相同
uniq:報告或移除重復的行
uniq [OPTION]... [INPUT [OUTPUT]]
-c:顯示每行的重復次數
-u:僅顯示未曾重復過的行
-d:僅顯示重復過的行
diff:逐行比較文本內容
diff [OPTION]... FILES
diff /path/to/oldfle /path/to/newfile >/path/to/patch_file
-u使用unfied機制,即顯示要修改的行的上下文,默認為3行
patch:向文件打補丁
patch [OPTIONS] -i /path/to/patch_file/patch/to/oldfile
patch /path/to/oldfile < /path/to/patch_file
練習:取出ifconfig eth0 命令結果中的ip地址。
ifconfig eth0 | cut -d: -f2 | awk '(NR==2){print $1}


