awk,grep,expect初識

awk 用法:awk ' pattern {action} '  mysql


變量名 含義 正則表達式

ARGC 命令行變元個數 sql

ARGV 命令行變元數組 數組

FILENAME 當前輸入文件名 ide

FNR 當前文件中的記錄號 函數

FS 輸入域分隔符,默認爲一個空格 spa

RS 輸入記錄分隔符 命令行

NF 當前記錄裏域個數 unix

NR 到目前爲止記錄數 字符串

OFS 輸出域分隔符 

ORS 輸出記錄分隔符 


一、awk '/101/'               file 顯示文件file中包含101的匹配行。 

   awk '/101/,/105/'         file 

   awk '$1 == 5'             file 

   awk '$1 == "CT"'          file 注意必須帶雙引號 

   awk '$1 * $2 >100 '       file  

   awk '$2 >5 && $2<=15'     file



二、awk '{print NR,NF,$1,$NF,}' file 顯示文件file的當前記錄號、域數和每一行的第一個和最後一個域。 

   awk '/101/ {print $1,$2 + 10}' file 顯示文件file的匹配行的第1、二個域加10。 

   awk '/101/ {print $1$2}'  file 

   awk '/101/ {print $1 $2}' file 顯示文件file的匹配行的第1、二個域,但顯示時域中間沒有分隔符。



三、df | awk '$4>1000000 '         經過管道符得到輸入,如:顯示第4個域知足條件的行。



四、awk -F "|" '{print $1}'   file 按照新的分隔符「|」進行操做。 

   awk  'BEGIN { FS="[: \t|]" } 

   {print $1,$2,$3}'     file 經過設置輸入分隔符(FS="[: \t|]")修改輸入分隔符。 


   Sep="|" 

   awk -F $Sep '{print $1}'  file 按照環境變量Sep的值作爲分隔符。    

   awk -F '[ :\t|]' '{print $1}' file 按照正則表達式的值作爲分隔符,這裏表明空格、:、TAB、|同時作爲分隔符。 

   awk -F '[][]'    '{print $1}' file 按照正則表達式的值作爲分隔符,這裏表明[、]



五、awk -f awkfile     file 經過文件awkfile的內容依次進行控制。 

   cat awkfile 

/101/{print "\047 Hello! \047"} --遇到匹配行之後打印 ' Hello! '.\047表明單引號。 

{print $1,$2}                   --由於沒有模式控制,打印每一行的前兩個域。



六、awk '$1 ~ /101/ {print $1}' file 顯示文件中第一個域匹配101的行(記錄)。



七、awk   'BEGIN { OFS="%"} 

   {print $1,$2}'           file 經過設置輸出分隔符(OFS="%")修改輸出格式。



八、awk   'BEGIN { max=100 ;print "max=" max}             BEGIN 表示在處理任意行以前進行的操做。 

   {max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一個域的最大值。 

   (表達式1?表達式2:表達式3 至關於: 

   if (表達式1) 

       表達式2 

   else 

       表達式3 

   awk '{print ($1>4 ? "high "$1: "low "$1)}' file 



九、awk '$1 * $2 >100 {print $1}' file 顯示文件中第一個域匹配101的行(記錄)。



十、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行後先將第3個域替換後再顯示該行(記錄)。 

    awk '{$7 %= 3; print $7}'  file 將第7域被3除,並將餘數賦給第7域再打印。



十一、awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行後爲變量wage賦值並打印該變量。



十二、awk '/tom/ {count++;}  

         END {print "tom was found "count" times"}' file END表示在全部輸入行處理完後進行處理。



1三、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4; 

         END {print "The total is $" cost>"filename"}'    file gsub函數用空串替換$和,再將結果輸出到filename中。 

    1 2 3 $1,200.00 

    1 2 3 $2,300.00 

    1 2 3 $4,000.00 


    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>1000&&$4<2000) c1+=$4; 

    else if ($4>2000&&$4<3000) c2+=$4; 

    else if ($4>3000&&$4<4000) c3+=$4; 

    else c4+=$4; } 

    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

    經過if和else if完成條件語句 


    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>3000&&$4<4000) exit; 

    else c4+=$4; } 

    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

    經過exit在某條件時退出,可是仍執行END操做。 

    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>3000) next; 

    else c4+=$4; } 

    END {printf  "c4=[%d]\n",c4}"' file 

    經過next在某條件時跳過該行,對下一行執行操做。 



1四、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file一、file二、file3的文件內容所有寫到fileall中,格式爲 

    打印文件並前置文件名。



1五、awk ' $1!=previous { close(previous); previous=$1 }    

    {print substr($0,index($0," ") +1)>$1}' fileall 把合併後的文件從新分拆爲3個文件。並與原文件一致。



1六、awk 'BEGIN {"date"|getline d; print d}'         經過管道把date的執行結果送給getline,並賦給變量d,而後打印。 



1七、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}' 

    經過getline命令交互輸入name,並顯示出來。 

    awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}' 

    打印/etc/passwd文件中用戶名包含050x_的用戶名。 


1八、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 經過while語句實現循環。 

    awk '{ for(i=1;i<NF;i++) {print NF,$i}}'   file 經過for語句實現循環。     

    type file|awk -F "/" ' 

    { for(i=1;i<NF;i++) 

    { if(i==NF-1) { printf "%s",$i } 

    else { printf "%s/",$i } }}'               顯示一個文件的全路徑。 

    用for和if顯示日期 

    awk  'BEGIN { 

for(j=1;j<=12;j++) 

{ flag=0; 

  printf "\n%d月份\n",j; 

        for(i=1;i<=31;i++) 

        { 

        if (j==2&&i>28) flag=1; 

        if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 

        if (flag==0) {printf "%02d%02d ",j,i} 

        } 

}'



1九、在awk中調用系統變量必須用單引號,若是是雙引號,則表示字符串 

Flag=abcd 

awk '{print '$Flag'}'   結果爲abcd 

awk '{print  "$Flag"}'   結果爲$Flag


以上轉自chinaunix,如下是本身的總結:


求和:


    $awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt   -----對a.txt文件的第四個域進行求和!


$ awk '/^(no|so)/' test-----打印全部以模式no或so開頭的行。


$ awk '/^[ns]/{print $1}' test-----若是記錄以n或s開頭,就打印這個記錄。


$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----若是第一個域以兩個數字結束就打印這個記錄。


$ awk '$1 == 100 || $2 < 50' test-----若是第一個或等於100或者第二個域小於50,則打印該行。


$ awk '$1 != 10' test-----若是第一個域不等於10就打印該行。


$ awk '/test/{print $1 + 10}' test-----若是記錄包含正則表達式test,則第一個域加10並打印出來。


$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----若是第一個域大於5則打印問號後面的表達式值,不然打印冒號後面的表達式值。


$ awk '/^root/,/^mysql/' test----打印以正則表達式root開頭的記錄到以正則表達式mysql開頭的記錄範圍內的全部記錄。若是找到一個新的正則表達式root開頭的記 錄,則繼續打印直到下一個以正則表達式mysql開頭的記錄爲止,或到文件末尾

相關文章
相關標籤/搜索