這裡提到awk,相信寫shell的朋友都會接觸到。AWK 是一種用於處理文字的程式語言工具。AWK 提供了極其強大的功能:
- 可以進行正規表示式的匹配
- 樣式裝入
- 流控制
- 數學運算子
- 程式控制語句
- 內建的變數和函式
可以把awk看作一門完全的程式設計語言,它處理文字的速度是快得驚人的。現在很多基於shell 日誌分析工具都可以用它完成。設計簡單,速度表現很好。 涉及到以上六個方面內容,我會在以後文章中加以介紹。 這次主要說下,怎麼樣把外部變數傳入到awk執行語句中。
一、基礎:
awk [ -F re] [parameter…] [‘pattern {action}’ ] [-f progfile][in_file…]
awk一般語法如上面所說。
如:
1 2 3 4 5 6 |
[chengmo@ localhost ~]$ echo 'awk code' | awk 'BEGIN{print "start\n============="}{print $0}END{print "=========\nend"}' start ============= awk code ========= end |
在 awk中兩個特別的表示式,BEGIN和END,這兩者都可用於pattern中(參考前面的awk語法),提供BEGIN和END的作用是給程式賦予初始狀態和在程式結束之後執行一些掃尾的工作。任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變數和預置(初始化)變數,使用END來輸出最終結果。
二、獲得外部變數方法
1、獲得普通外部變數
1 2 3 4 5 |
[chengmo@ localhost ~]$ test='awk code' [chengmo@ localhost ~]$ echo | awk '{print test}' test="$test" awk code [chengmo@ localhost ~]$ echo | awk test="$test" '{print test}' awk: cmd. line:1: fatal: cannot open file `{print test}' for reading (No such file or directory) |
格式如:awk ‘{action}’ 變數名=變數值 ,這樣傳入變數,可以在action中獲得值。 注意:變數名與值放到’{action}’後面。
[chengmo@ localhost ~]$ echo | awk ‘BEGIN{print test}’ test=”$test”
這種變數在:BEGIN的action不能獲得。
2.BEGIN程式塊中變數
1 2 3 4 5 |
[chengmo@ localhost ~]$ test='awk code' [chengmo@ localhost ~]$ echo | awk -v test="$test" 'BEGIN{print test}' awk code [chengmo@ localhost ~]$ echo | awk -v test="$test" '{print test}' awk code |
格式如:awk –v 變數名=變數值 [–v 變數2=值2 …] ‘BEGIN{action}’ 注意:用-v 傳入變數可以在3中型別的action 中都可以獲得到,但順序在 action前面。
3.獲得環境變數
1 2 3 4 5 6 7 |
[chengmo@ localhost ~]$ awk 'BEGIN{for (i in ENVIRON) {print i"="ENVIRON[i];}}' AWKPATH=.:/usr/share/awk SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SELINUX_LEVEL_REQUESTED= SELINUX_ROLE_REQUESTED= LANG=en_US.UTF-8 ....... |
只需要呼叫:awk內建變數 ENVIRON,就可以直接獲得環境變數。它是一個字典陣列。環境變數名 就是它的鍵值。