【unix學習】檔案處理3—正則表示式和grep命令
阿新 • • 發佈:2018-12-24
unix檔案處理—正則表示式和grep命令
正則表示式
- 使用\{\}匹配模式結果出現的次數
pattern\{n\} 用來匹配前面pattern出現次數。n為次數
pattern\{n,\}m 含義同上,但次數最少為n
pattern\{n,m\} 含義同上,但pattern出現次數在n與m之間,n , m為0-255中任意整數
簡單的例子:
匹配字母A出現兩次,並以B結尾,操作如下:
A\{2\}B
匹配值為AAB
匹配A至少4次,使用:
A\{4,\}B
可以得結果AAAAB或AAAAAAAB,但不能為AAAB。
如給出出現次數範圍,例如A出現2次到4次之間:
A\{2,4\}B
則結果為AAB、AAAB、AAAAB,而不是AB或AAAAAB等。 - 複雜的例子:前4個字元是數字,接下來是xx,最後4個也是數字,操作如下:
[0-9]\{4\}xx[0-9]\{4\} - 一些正則表示式的綜合例子:
^the 以the開頭行
[mayMAY] 對包含may大寫或小寫字母的行
^ USER$ 只包含USER的行
\. 帶句點的行
^d..x..x..x 對使用者、使用者組及其他使用者組成員有可執行許可權的目錄
[ ^ $ ] 對空行
[^0-9\$] 對非數字或美元標識
[^0-9A-Za-z] 對非數字或字母
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 對日期格式dd-mm-yyyy
[0-9]\{3}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 對IP地址格式nnn. nnn.nnn.nnn - 匹配空行並顯示對應的行號
grep -n “^$” /etc/files
grep命令
Purpose
Search the files for the given pattern, string, or expression
format
grep [options] pattern [file-list]
Options
i Ignore the case of letters
n Print line numbers along with matched lines
v Print nonmatching lines
c Print the number of matching lines only
w Search for the given pattern as a string
l Print only the names of files with matching lines
格式:
grep [OPTIONS] PATTERN [FILE…]
grep常用選項:
-c 只輸出匹配行的計數。
-i 不區分大小寫(只適用於單字元)。
-h 查詢多檔案時不顯示檔名。
-l 查詢多檔案時只輸出包含匹配字元的檔名。
-n 顯示匹配行及行號。
-v 顯示不包含匹配文字的所有行。
-w 匹配單詞
例項
- 匹配CS單詞
[s14516@gdufs]$grep -w CS /tmp/student_record
[s14516@gdufs]$grep [^E]CS /tmp/student_record
- 匹配CS結果的行數
[s14516@gdufs]$grep -c -w CS /tmp/student_record
- 顯示出現的行號
[s14516@gdufs]$grep -n -w CS /tmp/student_record
3:Al Davis CS 2.63
- 包含某個單詞的檔案
-l
[s14516@gdufs]$grep -l 'John' /tmp/*
/tmp/back.tar
/tmp/backup1.tar
/tmp/backup.tar
/tmp/donors
/tmp/paper.tar
/tmp/student_record
- 忽略大小寫
-i
[s14516@gdufs]$grep -n -i -w CS /tmp/student_record
- 查詢不匹配某個單詞的行
-v
[s14516@gdufs]$grep -v -i -w CS /tmp/student_record
- 查詢多個檔案
如果要在當前目錄下所有.doc檔案中查詢字串“sort”,方法如下:
grep "sort" *.doc
或在所有檔案中查詢單詞“sort it”
grep "sort it" *
- 行匹配的計數
grep -c "root" /etc/passwd
- 顯示滿足匹配模式的所有行及行號
grep -n root /etc/passwd
- 顯示非匹配行
grep -v “#” /etc/inittab
grep和正則表示式
- 模式範圍
grep "50[12]" /etc/passwd
- 匹配任意字元
grep "x..x" /etc/passwd
grep "x[a-z][a-z]x" /etc/passwd
- 模式出現機率
grep "0\{2,\}" /etc/passwd
- 或的正則表達,需要用egrep 命令,不支援grep
[s14516@gdufs]$egrep -w '\<CS|IBM' /tmp/student_record
- 檢視系統中的使用者但不包括root
who | grep -v ^root