學習sed & awk時做的筆記

zhyuh發表於2004-09-10
那陣子在moto做專案,利用間隙看完了一本o'reilly公司的sed&awk介紹,作了一些筆記。巧的是所學的一些東西在專案後期居然用到非常多,呵呵
[@more@]
1. 關於過濾字串問題
比如在一個文字中搜尋abcd這四個字元,使用grep 結果出來abcdef 、zabcd 、abcd 、 hiabcd.... 等等,其實只想搜尋abcd
A: 使用精確匹配 $grep "" filename
 
2. sed中查詢模式匹配:
. 單字元萬用字元
[0-9] 匹配0,1,2,3...8,9
[a-z] 匹配a,b,c...z
[^0-9] 匹配不含0,1,2...9的所有其他字元
".*"   匹配""內任何字串
^  行開始標誌
$  行結束標誌
 
3. sed中用bbb替換同一行中包括字串and的字串aaa,而不是每一行中的字串aaa
A: $sed -e '/and/s/aaa/bbb/' filename
 
4. sed刪除檔案filename中的所有行
A: $sed d filename
 
5. sed刪除檔案filename中的2至5行
A: $sed 2,5d filename
 
6. sed刪除檔案filename中包含字串abc的所有行
A: $sed /abc/d filename
 
7. A regular expression can use "n" to match an embeded newline
 
8. The regular expression can be delimited by any character except a blank or a newline
   EX: s!/usr/mail!/usr2/mail!
   Note that the delimiter appears three times and is required after the replacement "/usr2/mail"
 
9. SED Insert: [line-address]i
   sed '//i
   4700 cross court
   French Lick, IN' filename
   Desc: inserts two lines of text at a line matching ""
  
10. SED Append: [line-address]a
    sed '$a
    Append a new line ' filename
    DESC: append a new line in the end of filename  
   
11. SED Change: [line-address]c
    sed '/100/c
    one hundred' filename
    DESC: change the whole lines containing '100' into 'one hundred'  
 
12. 用SED顯示TAB等特殊字元: l
    sed -n -e "l" test1
    NOTE:顯示test1檔案的內容,包括TAB等特殊字元。-n過濾重複行
 
13. SED n:下一行/next p:顯示/print
    $ sed -n -e '/James/{
    > n
    > p
    > }' filename   
    DESC: 顯示filename中含有James字串的下一行
 
14. SED q: quit
    $sed '100q' filename
    DESC: print the first 100 lines from filename
   
15. SED y: transform
    /.*/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
    DESC:replace all the characters into capital   
   
16. convert file 'filename' from 1       to 2
                          2     1
                          11     22
                          22         11
                          111        222
                          222        111
    $ sed '/1/{
    > h
    > d
    > }
    > /2/{
    > G
    > }' filename      
    h/H: Hold, copy or append contents of pattern space to hold space
    g/G: Get, copy or append contents of hold space to pattern space
    x: Exchange, swap contents of hold space and pattern space
   
17. AWK中的特殊字元
    a alert character, usually ASCII BEL character
    b backspace
    f formfeed
    n newline
    r carriage return
    t horizontal tab
    v vertical tab
    c any literal character c
 
18. AWD系統變數
    FS field separator
    NR the number of current input record
    FILENAME the name of current input file
    RS the record separator, as a newline
    NF the number of fields for the current record
 
    EXAMPLE awkcmd 列出各紀錄平均值,並標出行號,最後顯示檔名和記錄數:
    #list the avg scores and row numbers         
    BEGIN { FS=" " }
    { print NR,".",$1,",",($2+$3+$4)/3 }
    END { print 
          print "File " FILENAME " has " NR " rows " }
   
    $awk -f awkcmd sourcefile
 
19. #將多行的塊紀錄轉成單行紀錄
    BEGIN { FS="n"; RS="" }
    { print $1, $NF }
   
20. 顯示當前目錄下各檔名和大小的例子   
    ls -lR|awk '
    BEGIN {print "        size","  ", "filename"}
    NF==9 && /^-/ {     #9列並以-開頭表示檔案
            filesize += $5
            ++filenum
            print " file ", $5,"  ",$9
            }
    NF==9 && /^d/ { #9列並以d開頭表示子目錄
            print " ", "t", $9
            }
    $1 ~ /^..*:$/ { # ~: Match Operator
       #ls -lR中子目錄顯示為 ./subdir:  以"."開頭"$"結尾的行判斷為子目錄的行
            print "t" $0
            }
    END { print "Total: ", filesize, " bytes (", filenum, " files)"} '
   
21. AWK傳遞引數和檢索資料
    $ cat awk_par
    awk '$2==search' search=$1 srcfile
    執行:
    $ awk_par par_val
    DESC: 引數par_val傳遞給變數search,顯示srcfile中第二列為par_val的記錄行
   
22. AWK中將shell引數傳遞給awk
    search=$1
    awk '$2 ~ /'"${search}"'/'  srcfile
    DESC: 將shell的第一個引數傳遞給變數search,同srcfile中第二列比較
       如果改成 awk '$2 ~ /'"${search:-.*}"'/' srcfile,則如果shell執行時無引數$1,就顯示所有記錄
      
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/207/viewspace-778460/,如需轉載,請註明出處,否則將追究法律責任。

相關文章