1、正則表達式
正則表達式:Regual Expression, REGEXP。 由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能; 基本正則表達式:BRE 擴展正則表達式:EREgit
1.基本正則表達式的元字符
1.1 字符匹配:正則表達式
- . :匹配任意單個字符
- []:匹配指定範圍內的任意單個字符
- [^]:匹配指定範圍外的任意單個字符
- [:digit:] 數字
- [:lower:] 小寫字母
- [:upper:] 大寫字母
- [:alpha:] 字母
- [:alnum:] 數字
- [:punct:] 標點符號
- [:space:] 垂直或水平的空白字符
1.2 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;shell
- *:匹配前面的字符任意次,包括0次;貪婪模式(儘量長的匹配)
- .:任意單個字符
- .*:任意長度的任意字符
- ?:匹配前面的字符0次或1次
- \+:匹配前面的字符至少1次
- \{n\}:匹配前面的字符n次
- \{n,m\}:匹配前面的字符n至m次
- \{n,\}:匹配前面的字符至少n次
- \{,m\}:匹配前面的字符至多m次
1.3 位置錨定:定位要錨定的字符出現的位置express
- ^:行首錨定,用於匹配模式的最左側
- $:行尾錨定,用於匹配模式的最右側
- ^$:空行
- ^[[:space:]]$:空白行(空行或含有空白字符的行)
- ^PATTERN$:用於PATTERN來匹配整行
- < 或\b 詞首錨定,用於單詞模式的左側
- \> 或\b 詞尾錨定,用於單詞模式的右側
- \bPATTERN\b 或<PATTERN> 匹配整個單詞 注意:非特殊字符組成的連續字符(字符串)都稱爲單詞;
1.4 分組及引用:\(\) 將一個或多個字符捆綁在一塊兒,當作一個總體進行處理;如\(root\)\+,表示將root分爲一組,且匹配至少1次 \1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符; \3:centos
示例:\(string1\+\(string2\)\) \1:(string1+(string2)) \2:(string2)bash
或者:| 示例: a|b :a或b C | cat:C或cat (C|c)at:Cat或catapp
2、grep、egrep、fgrep
grep:Global search REgular expression and Print out the line. 做用:文本搜索工具,根據用戶指定的「模式(過濾條件)」對目標文本逐行進行匹配檢查;打印匹配到的行; 模式:由正則表達式字符及文本字符所編寫的過濾條件less
grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] # option: --color=auto:對匹配到的文本着色後高亮顯示; -i:ignorecase,忽略字符的大小寫; -o:僅顯示匹配到的字符串自己; -w:顯示匹配到的整個單詞 -v, --invert-match:顯示不能被模式匹配到的行; -e:實現多個選項間的邏輯or關係 -n:顯示匹配的行號 -c: 統計匹配的行數 -E:支持使用擴展的正則表達式元字符; -q, --quiet, --silent:靜默模式,即不輸出任何信息; -A 5:after, 後5行 -B 5:before,前5行 -C 5:context,先後各5行
3、幾個文本查看工具:wc, cut, sort, uniq, diff, patch
1.wc:word count
wc - print newline, word, and byte counts for each file工具
wc [OPTION]... [FILE]... ~]# wc anaconda-ks.cfg 66 167 1858 anaconda-ks.cfg # 66:表示行數 # 167:表示字數 # 1858:字節數 # option -l:只計數行數 -w:只計算單詞總數 -c:只計數字節總數 -m:只計數字符總數
2.cut:remove sections from each line of files
cut OPTION... [FILE]... # option: -d --delimiter=DELIM : 指明分隔符,默認tab -f --fields=LIST : # :指定第#個字段 #-#:指定第#-#個字段;如3-5,第3-5個字段 #,#:指定離散的多個字段;如3,5,7 #,#-#:
3.sort:sort lines of text files
把整理過的文本顯示在STDOUT,不改變原始文件ui
sort [OPTION]... [FILE]... # option: -n:基於數值大小而非字符進行排序; -r:逆序排序; -f:忽略字符大小寫 -t CHAR:指定分隔符; (相似cut的-d命令) -k #:用於排序比較的字段;(相似cut -f 命令) -u:連續且相同的重複的行只保留一行;
4.uniq:report or omit repeated lines
報告或移除重複的行
uniq [OPTION]... [INPUT [OUTPUT]] # option -c:顯示每行的重複次數; -u:僅顯示不曾重複過的行; -d:僅顯示重複過的的行; # 常和sort一塊兒使用: sort userlist.txt | uniq-c
5.diff、patch
diff - compare files line by line patch - apply changes to files
diff [OPTION]... FILES diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE -u:使用unfied機制,即顯示要修改的行的上下文,默認爲3行,適用於補丁文件; ### patch:複製在其它文件中進行的改變(要謹慎使用),即向文件打補丁; patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE -b:自動備份改變了的文件
6.cat、tac、rev
cat - concatenate files and print on the standard output cat [OPTION]... [FILE]... # option: -E: 顯示行結束符$ -n: 對顯示出的每一行進行編號 -A:顯示全部控制符 -s:壓縮連續的空行成一行 ### tac - concatenate and print files in reverse (反向顯示cat的輸出結果) tac [OPTION]... [FILE]... ### rev - reverse lines of a file or files rev [options] [file ...]
7.more、less
分頁查看文件內容
8.head、tail
head - output the first part of files 默認顯示前10行 tail - output the last part of files 默認顯示後10行
head [OPTION]... [FILE]... # option: -n #: 指定獲取前#行 -c #: 指定獲取前#字節 -#:指定行數 ### tail [OPTION]... [FILE]... # option: -n #: 指定獲取後#行 -c #: 指定獲取後#字節 -#:指定行數 -f: 跟蹤顯示文件fd新追加的內容,經常使用日誌監控;至關於--follow=descriptor -F: 跟蹤文件名,至關於—follow=name --retry
4、練習
一、顯示/etc/passwd文件中不以/bin/bash結尾的行; ~]# grep -v "/bin/bash$" /etc/passwd
二、找出/etc/passwd文件中的兩位數或三位數; ~]# grep "<[0-9]{2,3}>" /etc/passwd
三、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以致少一個空白字符開頭,且後面非空白字符的行; ~]# grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
四、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行; ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
一、找出/proc/meminfo文件中,全部以大寫或小寫S開頭的行;至少有三種實現方式; ~]# grep -i "^s" /proc/meminfo ~]# grep "^[sS]" /proc/meminfo ~]# grep -E "^(s|S)" /proc/meminfo
二、顯示肖前系統上root、centos或user1用戶的相關信息; ~]# grep -E "^(root|centos|user1)>" /etc/passwd
三、找出/etc/rc.d/init.d/functions文件中某單詞後面跟一個小括號的行; ~]# grep -E -o "[_[:alnum:]]+()" /etc/rc.d/init.d/functions
四、使用echo命令輸出一絕對路徑,使用egrep取出基名; ~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
進一步:取出其路徑名;相似於對其執行dirname命令的結果;
五、找出ifconfig命令結果中的1-255之間的數值; ~]# ifconfig | grep -E -o "<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
六、課外做業:找出ifconfig命令結果中的IP地址; ~]# ifconfig | grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" --color=auto
七、添加用戶bash, testbash, basher以及nologin(其shell爲/sbin/nologin);然後找出/etc/passwd文件中用戶名同shell名的行; ~]# grep -E "^([^:]+>).*\1$" /etc/passwd