150 likes | 318 Views
AWK 入門. Advisor: Quincy Wu Speaker: Yu-Ping Chen Date: July 19, 2011. Introduction. Awk 是一種可以處理資料、產生格式化報表的語言,功能相當強大。 Awk 的工作方式是讀取資料檔,將每一列資料視為一筆記錄( record ),每筆記錄以欄位分隔符號分成若干欄位,然後,輸出各個欄位的值。 例如可使用 $1, $2,… 來取得各欄位的內容。 需要具備正規表示式的基本知識。. Awk 用法 (1).
E N D
AWK 入門 Advisor: Quincy Wu Speaker: Yu-Ping Chen Date: July 19, 2011
Introduction • Awk是一種可以處理資料、產生格式化報表的語言,功能相當強大。 • Awk的工作方式是讀取資料檔,將每一列資料視為一筆記錄(record),每筆記錄以欄位分隔符號分成若干欄位,然後,輸出各個欄位的值。 例如可使用$1, $2,…來取得各欄位的內容。 • 需要具備正規表示式的基本知識。
Awk用法(1) • awk '條件類型1{動作1} 條件類型2{動作2} ...' filename • $ awk '{ print }' /etc/passwd • $ awk -F":" '{ print $1 }' /etc/passwd • $ ls -l /etc | awk '{print $1 "\t" $9}'
Awk用法(2) • $ awk '{print $2,$3}' emp_names • $ awk '/AL/ {print $3,$2}' emp_names • $ awk '/AL/ {print $3,$2 ; print $4,$5}' emp_names • $ awk '/AL/ {print $3,$2} {print $4,$5}' emp_names • $ awk '/AL/ {print $3,$2 ; print $4", "$5"\n"}' emp_names • $ awk '/AL|IN/' emp_names
Awk 的變數(1) • 變數 • NF 每一行 ($0) 擁有的欄位總數 • NR 目前 awk所處理的是『第幾行』資料 • FS 目前的分隔字元,預設是空白鍵 • RS 記錄的分隔字元,預設是行 • OFS 輸出分隔字元 • ORS 輸出記錄分隔字元,預設是行 • $ last | awk '{print $1 "\t lines: " NR "\t columes: " NF}'
Awk的變數(2) • $ awk '{FS=":"}{print $2}' mou_names • $ awk -F":" '{OFS="-"}{print $1,$2,$3,$4,$5}' mou_names • $ awk -F":" '{print NR,$1,$2,$3}' mou_names • $ awk -F":" '/4601[2-5]/' mou_names
Awk 的運算(1) • 邏輯運算 • > 大於 • < 小於 • >= 大於或等於 • <= 小於或等於 • == 等於 • != 不等於 • 數學運算 • + adds numbers together • - subtracts • * multiplies • / divides
Awk 的運算(2) • ^ performs exponential mathematics • % gives the modulo • ++ adds one to the value of a variable • += assigns the result of an addition operation to a variable • -- subtracts one from a variable • -= assigns the result of a subtraction operation to a variable • *= assigns the result of multiplication • /= assigns the result of division • %= assigns the result of a modulo operation
Awk的運算(3) $ awk '{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3}' inventory $ awk '{x=x+$2} {print x}' inventory
Awk的運算(4) • $ awk '{x=x+($2*$3)}{print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3,"BAL: "x}' inventory • $ awk '{x=x+($2*$3)} {print $1,"QTY: "$2,"PRICE: "$3,"TOTAL: "$2*$3} END {print "Total Value of Inventory: " x}' inventory
Awk的運算(5) • $ sort emp_names | awk '{print $3,$2}' • $ awk '{print NR, $1 > "/tmp/filez" }' emp_names • $ awk '{ print $2 | "sort" }' emp_names
Example(1) $ cat > N # just a test 33 22 999 223 44 55 99 $ ./g-than N # just a test 999 223 99 $ cat g-than #!/bin/awk -f BEGIN{ lowerbound = 55 } /^#/ { print $0 } ! /^#/ { for(i=1; i<=NF; i++) if( $i > lowerbound ) print $i }
Example(2) $ cat > testnum klim 233 112 33 # oh!, just a test # again milk 333 22 klim 999 22 oak 222 redcow 1023 oak 11 milk 333 22 $ ./sum-varstestnum # oh!, just a test # again redcow = 1023 klim = 1399 oak = 233 milk = 710 $ cat > sum-vars #!/bin/awk -f /^#/ { print $0 } ! /^#/ { name = $1 sum = 0 for(i=2; i<=NF; i++) sum += $i var[ name ] += sum } END{ for (v in var) printf "%s = %d\n", v, var[v] }
Exercise • 如何利用 awk取出帳號與登入者的 IP,且帳號與 IP 之間以 [tab] 隔開? • /etc/passwd以冒號 ":" 作為欄位的分隔,如何查閱第三欄小於等於 50 以下的數據,並且僅列出帳號與第三欄? • 利用awk計算出檔案sipmemo有幾行空白行?
Reference • http://www.cyut.edu.tw/~dywang/linuxProgram/node20.html • http://erdos.csie.ncnu.edu.tw/~klim/unix-intro/unix-intro-991.html • http://www.vectorsite.net/tsawk_2.html