grep與正則表達式

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

相關文章
相關標籤/搜索