天天看點

grep awk sed 執行個體

文本過濾

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鍵的域分隔符。