文本過濾
5.1正規表達式
一種用來描述文本模式的特殊文法
由普通字元(例如字元a到z)已經特殊字元(稱為元字元,如/、*、?等)組成。
比對的字元串
文本過濾工具在某種模式下都支援正規表達式
5.2基本元字元集及其含義
字元 含義
^ 隻比對行首
$ 隻比對行尾
* 比對0個或多個此單字元
[] 隻比對[]内的字元。可以是一個單字元,也可以是字元序列。
可以使用-表示[]内字元序列範圍,如用[1-5]代替[12345]
\ 隻用來屏蔽一個元字元的特殊含義
. 隻比對任意單字元
pattern\{n\} 隻用來比對前面pattern出現的次數,n為次數
pattern\{n,\} 隻用來比對前面pattern出現的次數,n為次數,但次數最少為n
pattern\{n,m\} 隻用來比對前面pattern出現的次數,n為次數,但pattern出現
的次數在n與m之間
5.3 句點"."可以比對任意單字元
...x..x..x
drwxrwxrw- 不比對
-rw-rw-rw- 不比對
-rwx-wxr-x 比對
-rwxrwxrwx 比對
....xc....
3452xc63dd 比對
3452xw7134 不比對
3452xd6126 不比對
3452xc9871 比對
3452xc612 不比對
5.4^隻允許在一行的開始比對字元或單詞
^
^d
drwxrwxrw- 比對
-rw-rw-rw- 不比對
-rwx-wxr-x 不比對
-rwxrwxrwx 不比對
^...1
3451xc63dd 比對
3452xw7134 不比對
3452xd6126 不比對
3451xc9871 比對
5.5 行尾以$比對字元串或字元
$與^相反,它在行尾比對字元串或字元,$符号放在比對單詞後
trouble$ 比對以單詞trouble結尾的所有字元
^$ 比對空行
^.$ 比對包含一個字元的行
5.6用*比對單字元或其重複序列
10133*1
比對
101331
10133921
10133As1
5.7用\屏蔽一個特殊字元
特殊字元
",',||,^,*,+等
\*\.pas
正規表達式中比對以.*pas結尾的所有字元或檔案
5.8用[]比對一個範圍或集合
逗号将括弧内要比對的不同字元串分開
用“-”表示一個字元串範圍,表明字元串範圍從"-"左邊字元開始,到"-"右邊字元結束
[012345689]或[0-9]: 假定要比對任意一個數字
[a-z]:任意小寫字母
[A-Za-z]:任意大、小寫字母
[A-Za-z0-9]:比對任意字母或數字
[s,S]:比對大、小寫s
5.9 用\{\}比對模式結果出現的次數
A\{2\}B:A出現2次,AAB
A\{4,\}B:A最少出現4次,AAAAB,AAAAAB,....
A\{2,4\}B:出現次數範圍2-4次 AAB,AAAB,AAAAB
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}:比對IP位址
5.10 find指令
一個查找指令
查找具有某些特征檔案的指令
可周遊目前目錄甚至于整個檔案系統來查找某些檔案或目錄
周遊大的檔案系統時,一般放在背景執行
find指令的一般形式:
find pathname -options [-print -exec -ok]
pathname find指令所查找的目錄路徑。例如用.來表示目前目錄,用/來表示系統根目錄
-print find指令将比對的檔案輸出到标準輸出
-exec find指令對比對的檔案執行該參數所給出的shell指令,相應指令的形式為
'command'{} \;',注意{}和\;之間的空格
-ok和-exec的作用相同,隻不過以一種更為安全的模式來執行該參數所給出的shell
指令,在執行每一個指令之前,都會給出提示,讓使用者來确定是否執行。
5.11 find指令
find指令的一般形式:
-name 按照檔案名查找檔案
-perm 按照檔案權限來查找檔案
-user 按照檔案屬主來查找檔案
-group 按照檔案所屬的組來查找檔案
-mtime -n +n 按照檔案的更改時間來查找檔案,-n表示檔案更改時間距現在n天以内。
+n表示檔案更改時間距現在n天之前,find指令還有-atime和-ctime選項,但它們
都和-mtime選項相似
-size n[c]查找檔案長度為n快的檔案,帶有c是表示檔案長度以位元組計。
-nogroup 查找無有效所屬組的檔案,即該檔案所屬的組在/etc/groups中不存在
-nouser 查找無有效屬主的檔案,即該檔案的屬主在/etc/passwd中不存在
-newer file1 !file2查找更改時間比檔案file1新但比檔案file2舊的檔案
-type 查找某一類型的檔案,諸如:
b 塊裝置檔案
d 目錄
c 字元裝置檔案
p 管道檔案
l 符号連結檔案
f 普通檔案
5.12 find指令舉例
使用name選項
可以使用某種檔案名模式來比對檔案,記住要用引号将檔案名模式引起來
find -name "*.txt" -print 沒有寫路徑表示目前路徑
find ./ -name "*.txt" -print
find ./ -name "[A-Z]*" -print 會查找子目錄
find /etc -name "host*" -print
使用perm選項
find . -perm 755 -print
使用user和nouser選項
find `pwd` -user root -print
find `pwd` -nouser -print
使用group和nogroup選項
find ./ -group root -print
find ./ -nogroup -print
按照更改時間查找檔案
find ./ -mtime -5 -print
find ./ -mtime +3 -print
查找比某個檔案新或舊的檔案
find `pwd` -newer "tee.txt" ! -newer "parm" -print
比tee.txt新,不parm舊的檔案
使用type選項
find .. -type d -print
find .. -type l -print
使用size選項
find . -size +1000000c -print
find . -size +10 -print
使用depth選項
使用find指令時,可能希望先比對所有的檔案,再在子目錄中查找
find / -name "CON.FILE" -depth -print
使用exec或ok來執行shell指令
find . -type f -exec ls -l {} \;
find . -name "*.log" -mtime +5 -ok rm{} \;
不寫路徑或./或.或`pwd`都表示目前路徑
Xargs
在使用find指令的-exec選項處理比對到的檔案時,find指令将所有比對到的檔案一起傳遞給
exec,不幸的是,有些系統對能夠傳遞給exec的指令長度有限制,隻有在find指令運作幾分
鐘之後,就會出現溢出錯誤,錯誤資訊通常是"參數列太長"或"參數列溢出"。這就是xargs指令
的用處所在,特别是與find指令一起使用。exec會發起多個程序,而xargs不會多個,隻有一個
find ./ -perm -7 -print |xargs chmod 0-w
find ./ -type f -print |xargs file
5.13 grep介紹
grep是unix和linux中使用最廣泛的指令之一
對文本檔案進行模式查找
grep有三種變形
Grep:标準grep指令
Egrep:擴充grep,支援基本及擴充的正規表達式
Fgrep:快速grep
grep一般格式為:
grep[選項]基本正規表達式[檔案]
字元串參數最好采用雙引号括,一是以防被誤解為shell指令,二是可以用來查找多個單詞組成
的字元串
-c隻輸出比對行的基數
-i不區分大小寫(隻适應于單字元)
-h查詢多檔案時不顯示檔案名
-H顯示檔案名
-l查詢多檔案時隻輸出包含比對字元的檔案名
-n顯示比對行及行号
-s不顯示不存在或無比對文本的錯誤資訊
-v顯示不包含比對文本的所有行
grep "jennu" *.txt
grep "sort it" *
grep -c "OK" echo.sh
grep -i "OK" echo.sh
grep -v "OK" echo.sh
grep -v "OK[0-9]" echo.sh
grep "^[^210]" echo.sh 不是以2、1、0開頭的
grep "H*P" myfile
grep "[5-8][6-9][0-3]" myfile 一個三位數 百位5-8,個位6-9,十位0-3
grep "4\{2\}" myfile 包含 44
grep "4\{2,\}" myfile 至少包含兩個4
grep "4\{2,4\}" myfile 包含2到4個4
grep "^$" myfile 空行
grep "\?" myfile 包含?
grep "^d" myfile 以d開頭
grep "^[^d]" myfile 不以d開頭
grep指令類名
類 等價的正規表達式
[[:upper:]] [A-Z]
[[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z]
[[:space:]] 空格或tab鍵
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
grep "5[[:degit:]][[:degit:]]" myfile
5.14 awk介紹
可從檔案或字元串中基于指定規則浏覽和抽取資訊
是一種自解釋的程式設計語言
三種方式調用awk
指令行方式:
awk [-F file-spearator] 'command' input-files
awk腳本
所有awk指令插入一個檔案,并使awk程式可執行,然後用awk指令解釋器作為腳本的
首行,以便通過鍵入腳本名稱來調用它
awk指令插入一個單獨檔案
awk -f awk-script-file input_files
awk腳本由各種操作和模式組成
模式和動作
模式部分決定動作語句何時觸發及觸發事件(BEGIN,END)
動作對資料進行處理,放在大括号{}内知名(print)
分隔符、域和記錄
awk執行時,其浏覽域标記為$1,$2...$n。這種方法稱為域辨別。$0為所有域
注意執行時不要混淆符号$和shell提示符,它們是不同的
awk '{print $0}' awk.log
awk -F : '{print $1}' awk.log
awk '{print $1"\t"$2}' awk.log
awk 'BEGIN {print "IP Date\n----------"} {print $1"\t"$4} END {print "end-of-report"}' awk.log
begin中的是報告頭,end是報告尾
awk中的特殊元字元:+?
awk比對操作符:~,!~(~表示比對,!~表示不比對)
cat awk.log | awk '$1 ~ /218.9.131.96/' 比對218.9.131.96的所有的行
cat awk.log | awk '$1 !~ /218.9.131.96/' 不比對218.9.131.96的所有的行
awk '{if($1=="218.9.131.96")print $0}' awk.log
5.15 sed介紹
sed不與初始化檔案打交道,它操作的隻是一個拷貝,然後所有的改動沒有重定向到
一個檔案,将輸出到螢幕
sed是一種重要的文本過濾工具,使用一行指令或者使用管道與grep與awk相結合
非互動性文本流編輯
調用sed有三種方式
使用sed指令行格式為:
sed[選項] sed指令 輸入檔案
使用sed腳本檔案,格式為:
sed[選項] -f sed腳本檔案 輸入檔案
sed腳本檔案 [選項] 輸入檔案
不管是使用shell指令行方式或腳本檔案方式,如果沒有指定輸入檔案,sed從标準輸入
中接受輸入,一般是鍵盤或重定向結果
sed指令選項如下:
n 不列印
c 下一指令是編輯指令
f 如果正在調用sed腳本檔案
sed在檔案中查詢文本的方式
使用行号,可以是一個簡單數字,或是一個行号範圍
使用正規表達式
x x為一行号
x,y 表示行号範圍從x到y
/pattern/ 查詢包含模式的行
/pattern/pattern/ 查詢包含兩個模式的行
pattern/,x 在給定行号上查詢包含模式的行
x,/pattern/ 通過行号和模式查詢比對行
x,y! 查詢不包含指定行号x和y的行
基本sed編輯指令
p 列印比對行
= 顯示檔案行号
a\ 在定位行号後附加新檔案資訊
i\ 在定位行号後插入新文本資訊
d 删除定位行
c\ 用新文本替換定位文本
s 使用替換模式替換相應模式
r 從另一個檔案中讀文本
w 從文本寫一個檔案
q 第一個模式比對完成後推出或立即退出
l 顯示與八進制ASCII代碼等價的控制字元
{} 在定位行執行指令組
n 從另一個檔案中讀文本下一行,并附加在下一行
g 将模式2粘貼到/pattern n
y 傳送字元
sed '2p' awk.log 列印第2行的資訊 會列印比對和不比對的行
sed -n '2p' awk.log 隻列印比對的行
sed -n '1,3p' awk.log 列印1到3行
sed -n '/url/p' awk.log 列印比對到url的行
sed -n '14,/url/p' awk.log 從第4行開始查找,直到第一個比對url的行(不包括第四行)
sed -n '/^$/=' awk.log 列印空行的行号
sed -n -e '/^$/p' -e '/^$/=' awk.log 列印空行及行号
sed -n '/4ddddd/a\huxiaoyi' sed.log 找到比對的行,并替換原來的内容
sed -n '/4ddddd/i\huxiaoyi' sed.log 找到比對的行,并替換原來的内容
sed -n '/4ddddd/c\huxiaoyi' sed.log 找到比對的行,并替換原來的内容
sed '1,2d' sed.log 删除1,2行,但是sed.log檔案中并沒有真正删除掉
sed 's/chinaitlab/chinaitlab shenzhen/g' sed.log 把chinaitlab全部替換為chinaitlab shenzhen
sed -n 's/chinaitlab/&hello/p' sed.log 在chinaitlab後面追加hello
sed 'lr ctrl.txt' sed.log
sed -n '/china/l' sed.log
5.16 合并與分割
sort [options] files
許多不同的域按不同的列順序分類
-c 測試檔案是否已經分類
-m 合并兩個分類檔案
-u 删除所有複制行
-o 存儲sort結果的輸出檔案名
-t 域分隔符;用非空格或tab鍵分隔域
+n n為域号,使用此域号開始分類
n 指定分類是域上的數字分類項
-r 比較求逆
sort -c sed.log
sort -u sed.log 合并重複行
sort -r sed.log
sort -t "/" +2 sed.log
sort -t "/" +2n sed.log
unip [option] files
從一個文本檔案中去除或禁止重複行
-u 隻顯示不重複行
-d 隻顯示有重複資料行,每種重複行隻顯示其中一行
-c 列印每一重複行出現次數
-f n為數字,前n個域被忽略
unip -c myfile.txt
unip -d myfile.txt
unip -f 2 myfile.txt
unip -d myfile.txt
join [options] file1 file2
用來将來自兩個分類文本檔案的行連在一起
-an,n為一數字,用于連接配接時從檔案n中顯示不比對行
-o n.m,連接配接域,n為檔案号,m為域号。
-j n m,n為檔案名,m為域号。使用其他域做連接配接域
t域分隔符。用來設定非空格或tab鍵的域分隔符。