awk === ææ¬åæ°æ®è¿è¡å¤ççç¼ç¨è¯è¨ ## è¡¥å 说æ **awk** æ¯ä¸ç§ç¼ç¨è¯è¨ï¼ç¨äºå¨linux/unixä¸å¯¹ææ¬åæ°æ®è¿è¡å¤çãæ°æ®å¯ä»¥æ¥èªæ åè¾å ¥(stdin)ãä¸ä¸ªæå¤ä¸ªæä»¶ï¼æå ¶å®å½ä»¤çè¾åºã宿¯æç¨æ·èªå®ä¹å½æ°å卿æ£å表达å¼çå è¿åè½ï¼æ¯linux/unixä¸çä¸ä¸ªå¼ºå¤§ç¼ç¨å·¥å ·ãå®å¨å½ä»¤è¡ä¸ä½¿ç¨ï¼ä½æ´å¤æ¯ä½ä¸ºèæ¬æ¥ä½¿ç¨ãawkæå¾å¤å 建çåè½ï¼æ¯å¦æ°ç»ã彿°çï¼è¿æ¯å®åCè¯è¨çç¸åä¹å¤ï¼çµæ´»æ§æ¯awkæå¤§çä¼å¿ã ## awkå½ä»¤æ ¼å¼åé项 **è¯æ³å½¢å¼** ``` awk [options] 'script' var=value file(s) awk [options] -f scriptfile var=value file(s) ``` **常ç¨å½ä»¤é项** * **-F fs   ** fsæå®è¾å ¥åé符ï¼fså¯ä»¥æ¯åç¬¦ä¸²ææ£å表达å¼ï¼å¦-F: * **-v var=value   ** èµå¼ä¸ä¸ªç¨æ·å®ä¹åéï¼å°å¤é¨åéä¼ éç»awk * **-f scripfile  ** ä»èæ¬æä»¶ä¸è¯»åawkå½ä»¤ * **-m[fr] val   ** 对valå¼è®¾ç½®å å¨éå¶ï¼-mfé项éå¶åé ç»valçæå¤§åæ°ç®ï¼-mré项éå¶è®°å½çæå¤§æ°ç®ãè¿ä¸¤ä¸ªåè½æ¯Bellå®éªå®¤çawkçæ©å±åè½ï¼å¨æ åawkä¸ä¸éç¨ã ## awk模å¼åæä½ awkèæ¬æ¯ç±æ¨¡å¼åæä½ç»æçã ### æ¨¡å¼ æ¨¡å¼å¯ä»¥æ¯ä»¥ä¸ä»»æä¸ä¸ªï¼ * /æ£å表达å¼/ï¼ä½¿ç¨éé ç¬¦çæ©å±éã * å ³ç³»è¡¨è¾¾å¼ï¼ä½¿ç¨è¿ç®ç¬¦è¿è¡æä½ï¼å¯ä»¥æ¯åç¬¦ä¸²ææ°åçæ¯è¾æµè¯ã * 模å¼å¹é 表达å¼ï¼ç¨è¿ç®ç¬¦`~`ï¼å¹é ï¼å`!~`ï¼ä¸å¹é ï¼ã * BEGINè¯å¥åãpatternè¯å¥åãENDè¯å¥åï¼åè§awkçå·¥ä½åç ### æä½ æä½ç±ä¸ä¸ªæå¤ä¸ªå½ä»¤ã彿°ã表达å¼ç»æï¼ä¹é´ç±æ¢è¡ç¬¦æåå·éå¼ï¼å¹¶ä½äºå¤§æ¬å·å ï¼ä¸»è¦é¨åæ¯ï¼ * åéææ°ç»èµå¼ * è¾åºå½ä»¤ * å ç½®å½æ° * æ§å¶æµè¯å¥ ## awkèæ¬åºæ¬ç»æ ``` awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file ``` ä¸ä¸ªawkèæ¬é常ç±ï¼BEGINè¯å¥åãè½å¤ä½¿ç¨æ¨¡å¼å¹é çéç¨è¯å¥åãENDè¯å¥å3é¨åç»æï¼è¿ä¸ä¸ªé¨åæ¯å¯éçãä»»æä¸ä¸ªé¨åé½å¯ä»¥ä¸åºç°å¨èæ¬ä¸ï¼èæ¬é常æ¯è¢« **åå¼å·** æ **åå¼å·** ä¸ï¼ä¾å¦ï¼ ``` awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename ``` ### awkçå·¥ä½åç ``` awk 'BEGIN{ commands } pattern{ commands } END{ commands }' ``` * ç¬¬ä¸æ¥ï¼æ§è¡`BEGIN{ commands }`è¯å¥åä¸çè¯å¥ï¼ * ç¬¬äºæ¥ï¼ä»æä»¶ææ åè¾å ¥(stdin)读åä¸è¡ï¼ç¶åæ§è¡`pattern{ commands }`è¯å¥åï¼å®éè¡æ«ææä»¶ï¼ä»ç¬¬ä¸è¡å°æåä¸è¡éå¤è¿ä¸ªè¿ç¨ï¼ç´å°æä»¶å ¨é¨è¢«è¯»å宿¯ã * ç¬¬ä¸æ¥ï¼å½è¯»è³è¾å ¥æµæ«å°¾æ¶ï¼æ§è¡`END{ commands }`è¯å¥åã **BEGINè¯å¥å** å¨awkå¼å§ä»è¾å ¥æµä¸è¯»åè¡ **ä¹å** 被æ§è¡ï¼è¿æ¯ä¸ä¸ªå¯éçè¯å¥åï¼æ¯å¦åéåå§åãæå°è¾åºè¡¨æ ¼ç表头çè¯å¥é常å¯ä»¥åå¨BEGINè¯å¥åä¸ã **ENDè¯å¥å** å¨awkä»è¾å ¥æµä¸è¯»å宿æçè¡ **ä¹å** å³è¢«æ§è¡ï¼æ¯å¦æå°ææè¡çåæç»æè¿ç±»ä¿¡æ¯æ±æ»é½æ¯å¨ENDè¯å¥åä¸å®æï¼å®ä¹æ¯ä¸ä¸ªå¯éè¯å¥åã **patternè¯å¥å** ä¸çéç¨å½ä»¤æ¯æéè¦çé¨åï¼å®ä¹æ¯å¯éçãå¦ææ²¡ææä¾patternè¯å¥åï¼åé»è®¤æ§è¡`{ print }`ï¼å³æå°æ¯ä¸ä¸ªè¯»åå°çè¡ï¼awk读åçæ¯ä¸è¡é½ä¼æ§è¡è¯¥è¯å¥åã **示ä¾** ``` echo -e "A line 1nA line 2" | awk 'BEGIN{ print "Start" } { print } END{ print "End" }' Start A line 1 A line 2 End ``` å½ä½¿ç¨ä¸å¸¦åæ°ç`print`æ¶ï¼å®å°±æå°å½åè¡ï¼å½`print`çåæ°æ¯ä»¥éå·è¿è¡åéæ¶ï¼æå°æ¶åä»¥ç©ºæ ¼ä½ä¸ºå®ç符ãå¨awkçprintè¯å¥åä¸åå¼å·æ¯è¢«å½ä½æ¼æ¥ç¬¦ä½¿ç¨ï¼ä¾å¦ï¼ ``` echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' v1 v2 v3 ``` åå¼å·æ¼æ¥ä½¿ç¨ï¼ ``` echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' v1=v2=v3 ``` { }类似ä¸ä¸ªå¾ªç¯ä½ï¼ä¼å¯¹æä»¶ä¸çæ¯ä¸è¡è¿è¡è¿ä»£ï¼é常åéåå§åè¯å¥ï¼å¦ï¼i=0ï¼ä»¥åæå°æä»¶å¤´é¨çè¯å¥æ¾å ¥BEGINè¯å¥åä¸ï¼å°æå°çç»æçè¯å¥æ¾å¨ENDè¯å¥åä¸ã ## awkå ç½®åéï¼é¢å®ä¹åéï¼ è¯´æï¼[A][N][P][G]表示第ä¸ä¸ªæ¯æåéçå·¥å ·ï¼[A]=awkã[N]=nawkã[P]=POSIXawkã[G]=gawk ``` **$n** å½åè®°å½ç第nä¸ªåæ®µï¼æ¯å¦n为1表示第ä¸ä¸ªå段ï¼n为2表示第äºä¸ªå段ã **$0** è¿ä¸ªåéå 嫿§è¡è¿ç¨ä¸å½åè¡çææ¬å 容ã [N] **ARGC** å½ä»¤è¡åæ°çæ°ç®ã [G] **ARGIND** å½ä»¤è¡ä¸å½åæä»¶çä½ç½®ï¼ä»0å¼å§ç®ï¼ã [N] **ARGV** å å«å½ä»¤è¡åæ°çæ°ç»ã [G] **CONVFMT** æ°åè½¬æ¢æ ¼å¼ï¼é»è®¤å¼ä¸º%.6gï¼ã [P] **ENVIRON** ç¯å¢åéå ³èæ°ç»ã [N] **ERRNO** æåä¸ä¸ªç³»ç»é误çæè¿°ã [G] **FIELDWIDTHS** åæ®µå®½åº¦å表ï¼ç¨ç©ºæ ¼é®åéï¼ã [A] **FILENAME** å½åè¾å ¥æä»¶çåã [P] **FNR** åNRï¼ä½ç¸å¯¹äºå½åæä»¶ã [A] **FS** åæ®µåé符ï¼é»è®¤æ¯ä»»ä½ç©ºæ ¼ï¼ã [G] **IGNORECASE** å¦æä¸ºçï¼åè¿è¡å¿½ç¥å¤§å°åçå¹é ã [A] **NF** è¡¨ç¤ºåæ®µæ°ï¼å¨æ§è¡è¿ç¨ä¸å¯¹åºäºå½åçåæ®µæ°ã [A] **NR** è¡¨ç¤ºè®°å½æ°ï¼å¨æ§è¡è¿ç¨ä¸å¯¹åºäºå½åçè¡å·ã [A] **OFMT** æ°åçè¾åºæ ¼å¼ï¼é»è®¤å¼æ¯%.6gï¼ã [A] **OFS** è¾åºå段åé符ï¼é»è®¤å¼æ¯ä¸ä¸ªç©ºæ ¼ï¼ã [A] **ORS** è¾åºè®°å½åé符ï¼é»è®¤å¼æ¯ä¸ä¸ªæ¢è¡ç¬¦ï¼ã [A] **RS** è®°å½åé符ï¼é»è®¤æ¯ä¸ä¸ªæ¢è¡ç¬¦ï¼ã [N] **RSTART** ç±match彿°æå¹é çå符串ç第ä¸ä¸ªä½ç½®ã [N] **RLENGTH** ç±match彿°æå¹é çå符串çé¿åº¦ã [N] **SUBSEP** æ°ç»ä¸æ åé符ï¼é»è®¤å¼æ¯34ï¼ã ``` **示ä¾** ``` echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}' Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3 Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5 Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7 ``` 使ç¨`print $NF`å¯ä»¥æå°åºä¸è¡ä¸çæåä¸ä¸ªå段ï¼ä½¿ç¨`$(NF-1)`忝æå°åæ°ç¬¬äºä¸ªå段ï¼å ¶ä»ä»¥æ¤ç±»æ¨ï¼ ``` echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $NF}' f3 f5 ``` ``` echo -e "line1 f2 f3n line2 f4 f5" | awk '{print $(NF-1)}' f2 f4 ``` æå°æ¯ä¸è¡ç第äºå第ä¸ä¸ªåæ®µï¼ ``` awk '{ print $2,$3 }' filename ``` ç»è®¡æä»¶ä¸çè¡æ°ï¼ ``` awk 'END{ print NR }' filename ``` 以ä¸å½ä»¤åªä½¿ç¨äºENDè¯å¥åï¼å¨è¯»å ¥æ¯ä¸è¡çæ¶ï¼awkä¼å°NRæ´æ°ä¸ºå¯¹åºçè¡å·ï¼å½å°è¾¾æåä¸è¡NRçå¼å°±æ¯æåä¸è¡çè¡å·ï¼æä»¥ENDè¯å¥åä¸çNRå°±æ¯æä»¶çè¡æ°ã ä¸ä¸ªæ¯ä¸è¡ä¸ç¬¬ä¸ä¸ªå段å¼ç´¯å çä¾åï¼ ``` seq 5 | awk 'BEGIN{ sum=0; print "æ»åï¼" } { print $1"+"; sum+=$1 } END{ print "çäº"; print sum }' æ»åï¼ 1+ 2+ 3+ 4+ 5+ çäº 15 ``` ## å°å¤é¨åéå¼ä¼ éç»awk åå© **`-v`é项** ï¼å¯ä»¥å°å¤é¨å¼ï¼å¹¶éæ¥èªstdinï¼ä¼ éç»awkï¼ ``` VAR=10000 echo | awk -v VARIABLE=$VAR '{ print VARIABLE }' ``` å¦ä¸ç§ä¼ éå¤é¨åéæ¹æ³ï¼ ``` var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2 ``` å½è¾å ¥æ¥èªäºæä»¶æ¶ä½¿ç¨ï¼ ``` awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename ``` 以䏿¹æ³ä¸ï¼åéä¹é´ç¨ç©ºæ ¼åéä½ä¸ºawkçå½ä»¤è¡åæ°è·éå¨BEGINã{}åENDè¯å¥åä¹åã ## æ¥æ¾è¿ç¨pid ``` netstat -antup | grep 7770 | awk '{ print $NF NR}' | awk '{ print $1}' ``` ## awkè¿ç®ä¸å¤æ ä½ä¸ºä¸ç§ç¨åºè®¾è®¡è¯è¨æåºå ·æçç¹ç¹ä¹ä¸ï¼awkæ¯æå¤ç§è¿ç®ï¼è¿äºè¿ç®ä¸Cè¯è¨æä¾çåºæ¬ç¸åãawkè¿æä¾äºä¸ç³»åå ç½®çè¿ç®å½æ°ï¼å¦logãsqrãcosãsinçï¼åä¸äºç¨äºå¯¹å符串è¿è¡æä½ï¼è¿ç®ï¼ç彿°ï¼å¦lengthãsubstrççï¼ãè¿äºå½æ°çå¼ç¨å¤§å¤§çæé«äºawkçè¿ç®åè½ãä½ä¸ºå¯¹æ¡ä»¶è½¬ç§»æä»¤çä¸é¨åï¼å ³ç³»å¤ææ¯æ¯ç§ç¨åºè®¾è®¡è¯è¨é½å ·å¤çåè½ï¼awkä¹ä¸ä¾å¤ï¼awkä¸å 许è¿è¡å¤ç§æµè¯ï¼ä½ä¸ºæ ·å¼å¹é ï¼è¿æä¾äºæ¨¡å¼å¹é 表达å¼~ï¼å¹é ï¼å!~ï¼ä¸å¹é ï¼ãä½ä¸ºå¯¹æµè¯çä¸ç§æ©å ï¼awk乿¯æç¨é»è¾è¿ç®ç¬¦ã ### ç®æ¯è¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | + - | å ï¼å | | * / & | ä¹ï¼é¤ä¸æ±ä½ | | + - ! | ä¸å å ï¼ååé»è¾é | | ^ *** | æ±å¹ | | ++ -- | å¢å æåå°ï¼ä½ä¸ºåç¼æåç¼ | ä¾ï¼ ``` awk 'BEGIN{a="b";print a++,++a;}' 0 2 ``` 注æï¼ææç¨ä½ç®æ¯è¿ç®ç¬¦è¿è¡æä½ï¼æä½æ°èªå¨è½¬ä¸ºæ°å¼ï¼ææéæ°å¼é½å为0 ### èµå¼è¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | = += -= *= /= %= ^= **= | èµå¼è¯å¥ | ä¾ï¼ ``` a+=5; çä»·äºï¼a=a+5; å ¶å®åç±» ``` ### é»è¾è¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | `\|\|` | é»è¾æ | | && | é»è¾ä¸ | ä¾ï¼ ``` awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' 0 1 ``` ### æ£åè¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | ~ !~ | å¹é æ£å表达å¼åä¸å¹é æ£åè¡¨è¾¾å¼ | ä¾ï¼ ``` awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' ok ``` ### å ³ç³»è¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | < <= > >= != == | å ³ç³»è¿ç®ç¬¦ | ä¾ï¼ ``` awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' ok ``` 注æï¼> < å¯ä»¥ä½ä¸ºå符串æ¯è¾ï¼ä¹å¯ä»¥ç¨ä½æ°å¼æ¯è¾ï¼å ³é®çæä½æ°å¦ææ¯å符串就ä¼è½¬æ¢ä¸ºå符串æ¯è¾ã两个é½ä¸ºæ°åæè½¬ä¸ºæ°å¼æ¯è¾ãå符串æ¯è¾ï¼æç §ASCIIç é¡ºåºæ¯è¾ã ### å ¶å®è¿ç®ç¬¦ | è¿ç®ç¬¦ | æè¿° | | ----- | ---- | | $ | åæ®µå¼ç¨ | | ç©ºæ ¼ | åç¬¦ä¸²è¿æ¥ç¬¦ | | ?: | Cæ¡ä»¶è¡¨è¾¾å¼ | | in | æ°ç»ä¸æ¯å¦å卿é®å¼ | ä¾ï¼ ``` awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' ok ``` ``` awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' 0 ``` ``` awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 1 ``` ### è¿ç®çº§ä¼å 级表 !级å«è¶é«è¶ä¼å 级å«è¶é«è¶ä¼å ## awké«çº§è¾å ¥è¾åº ### 读åä¸ä¸æ¡è®°å½ awkä¸`next`è¯å¥ä½¿ç¨ï¼å¨å¾ªç¯éè¡å¹é ï¼å¦æéå°nextï¼å°±ä¼è·³è¿å½åè¡ï¼ç´æ¥å¿½ç¥ä¸é¢è¯å¥ãèè¿è¡ä¸ä¸è¡å¹é ãnextè¯å¥ä¸è¬ç¨äºå¤è¡åå¹¶ï¼ ``` cat text.txt a b c d e awk 'NR%2==1{next}{print NR,$0;}' text.txt 2 b 4 d ``` å½è®°å½è¡å·é¤ä»¥2ä½1ï¼å°±è·³è¿å½åè¡ãä¸é¢ç`print NR,$0`ä¹ä¸ä¼æ§è¡ãä¸ä¸è¡å¼å§ï¼ç¨åºæå¼å§å¤æ`NR%2`å¼ãè¿ä¸ªæ¶åè®°å½è¡å·æ¯`ï¼2` ï¼å°±ä¼æ§è¡ä¸é¢è¯å¥åï¼`'print NR,$0'` åæåç°éè¦å°å 嫿âwebâè¡è¿è¡è·³è¿ï¼ç¶åéè¦å°å 容ä¸ä¸é¢è¡å并为ä¸è¡ï¼ ``` cat text.txt web01[192.168.2.100] httpd ok tomcat ok sendmail ok web02[192.168.2.101] httpd ok postfix ok web03[192.168.2.102] mysqld ok httpd ok 0 awk '/^web/{T=$0;next;}{print T":t"$0;}' test.txt web01[192.168.2.100]: httpd ok web01[192.168.2.100]: tomcat ok web01[192.168.2.100]: sendmail ok web02[192.168.2.101]: httpd ok web02[192.168.2.101]: postfix ok web03[192.168.2.102]: mysqld ok web03[192.168.2.102]: httpd ok ``` ### ç®åå°è¯»å䏿¡è®°å½ `awk getline`ç¨æ³ï¼è¾åºéå®åéç¨å°`getline彿°`ãgetline仿 åè¾å ¥ã管éæè å½åæ£å¨å¤ççæä»¶ä¹å¤çå ¶ä»è¾å ¥æä»¶è·å¾è¾å ¥ãå®è´è´£ä»è¾å ¥è·å¾ä¸ä¸è¡çå 容ï¼å¹¶ç»NF,NRåFNRçå 建åéèµå¼ã妿å¾å°ä¸æ¡è®°å½ï¼getline彿°è¿å1ï¼å¦æå°è¾¾æä»¶çæ«å°¾å°±è¿å0ï¼å¦æåºç°é误ï¼ä¾å¦æå¼æä»¶å¤±è´¥ï¼å°±è¿å-1ã getlineè¯æ³ï¼getline varï¼åévarå å«äºç¹å®è¡çå 容ã awk getline仿´ä½ä¸æ¥è¯´ï¼ç¨æ³è¯´æï¼ * **å½å ¶å·¦å³æ éå®å符`|`æ`<`æ¶ï¼** getlineä½ç¨äºå½åæä»¶ï¼è¯»å ¥å½åæä»¶ç第ä¸è¡ç»å ¶åè·çåé`var`æ`$0`ï¼æ åéï¼ï¼åºè¯¥æ³¨æå°ï¼ç±äºawkå¨å¤çgetlineä¹åå·²ç»è¯»å ¥äºä¸è¡ï¼æä»¥getlineå¾å°çè¿åç»ææ¯éè¡çã * **å½å ¶å·¦å³æéå®å符`|`æ`<`æ¶ï¼** getlineåä½ç¨äºå®åè¾å ¥æä»¶ï¼ç±äºè¯¥æä»¶æ¯åæå¼ï¼å¹¶æ²¡æè¢«awkè¯»å ¥ä¸è¡ï¼åªæ¯getlineè¯»å ¥ï¼é£ä¹getlineè¿åçæ¯è¯¥æä»¶ç第ä¸è¡ï¼è䏿¯éè¡ã **示ä¾ï¼** æ§è¡linuxç`date`å½ä»¤ï¼å¹¶éè¿ç®¡éè¾åºç»`getline`ï¼ç¶ååæè¾åºèµå¼ç»èªå®ä¹åéoutï¼å¹¶æå°å®ï¼ ``` awk 'BEGIN{ "date" | getline out; print out }' test ``` æ§è¡shellçdateå½ä»¤ï¼å¹¶éè¿ç®¡éè¾åºç»getlineï¼ç¶ågetlineä»ç®¡éä¸è¯»åå¹¶å°è¾å ¥èµå¼ç»outï¼split彿°æåéoutè½¬åææ°ç»monï¼ç¶åæå°æ°ç»monç第äºä¸ªå ç´ ï¼ ``` awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[2] }' test ``` å½ä»¤lsçè¾åºä¼ éç»gelineä½ä¸ºè¾å ¥ï¼å¾ªç¯ä½¿getlineä»lsçè¾åºä¸è¯»åä¸è¡ï¼å¹¶æå®æå°å°å±å¹ãè¿é没æè¾å ¥æä»¶ï¼å 为BEGINå卿å¼è¾å ¥æä»¶åæ§è¡ï¼æä»¥å¯ä»¥å¿½ç¥è¾å ¥æä»¶ã ``` awk 'BEGIN{ while( "ls" | getline) print }' ``` ### å ³éæä»¶ awkä¸å 许å¨ç¨åºä¸å ³éä¸ä¸ªè¾å ¥æè¾åºæä»¶ï¼æ¹æ³æ¯ä½¿ç¨awkçcloseè¯å¥ã ``` close("filename") ``` filenameå¯ä»¥æ¯getlineæå¼çæä»¶ï¼ä¹å¯ä»¥æ¯stdinï¼å 嫿件åçåéæè getline使ç¨çç¡®åå½ä»¤ãæä¸ä¸ªè¾åºæä»¶ï¼å¯ä»¥æ¯stdoutï¼å 嫿件åçåéæä½¿ç¨ç®¡éçç¡®åå½ä»¤ã ### è¾åºå°ä¸ä¸ªæä»¶ awkä¸å 许ç¨å¦ä¸æ¹å¼å°ç»æè¾åºå°ä¸ä¸ªæä»¶ï¼ ``` echo | awk '{printf("hello word!n") > "datafile"}' æ echo | awk '{printf("hello word!n") >> "datafile"}' ``` ## è®¾ç½®åæ®µå®ç符 é»è®¤çåæ®µå®ç符æ¯ç©ºæ ¼ï¼å¯ä»¥ä½¿ç¨`-F "å®ç符"` æç¡®æå®ä¸ä¸ªå®çç¬¦ï¼ ``` awk -F: '{ print $NF }' /etc/passwd æ awk 'BEGIN{ FS=":" } { print $NF }' /etc/passwd ``` å¨`BEGINè¯å¥å`ä¸åå¯ä»¥ç¨`OFS=âå®ç符â`设置è¾åºå段çå®ç符ã ## æµç¨æ§å¶è¯å¥ å¨linux awkçwhileãdo-whileåforè¯å¥ä¸å 许使ç¨break,continueè¯å¥æ¥æ§å¶æµç¨èµ°åï¼ä¹å 许使ç¨exitè¿æ ·çè¯å¥æ¥éåºãbreak䏿å½åæ£å¨æ§è¡ç循ç¯å¹¶è·³å°å¾ªç¯å¤æ§è¡ä¸ä¸æ¡è¯å¥ãif æ¯æµç¨éæ©ç¨æ³ãawkä¸ï¼æµç¨æ§å¶è¯å¥ï¼è¯æ³ç»æï¼ä¸cè¯è¨ç±»åãæäºè¿äºè¯å¥ï¼å ¶å®å¾å¤shellç¨åºé½å¯ä»¥äº¤ç»awkï¼è䏿§è½æ¯é常快çãä¸é¢æ¯å个è¯å¥ç¨æ³ã ### æ¡ä»¶å¤æè¯å¥ ``` if(表达å¼) è¯å¥1 else è¯å¥2 ``` æ ¼å¼ä¸è¯å¥1å¯ä»¥æ¯å¤ä¸ªè¯å¥ï¼ä¸ºäºæ¹ä¾¿å¤æåé è¯»ï¼æå¥½å°å¤ä¸ªè¯å¥ç¨{}æ¬èµ·æ¥ãawkåæç»æå 许åµå¥ï¼å ¶æ ¼å¼ä¸ºï¼ ``` if(表达å¼) {è¯å¥1} else if(表达å¼) {è¯å¥2} else {è¯å¥3} ``` 示ä¾ï¼ ``` awk 'BEGIN{ test=100; if(test>90){ print "very good"; } else if(test>60){ print "good"; } else{ print "no pass"; } }' very good ``` æ¯æ¡å½ä»¤è¯å¥åé¢å¯ä»¥ç¨`;` **åå·** ç»å°¾ã ### 循ç¯è¯å¥ #### whileè¯å¥ ``` while(表达å¼) {è¯å¥} ``` 示ä¾ï¼ ``` awk 'BEGIN{ test=100; total=0; while(i<=test){ total+=i; i++; } print total; }' 5050 ``` #### forå¾ªç¯ forå¾ªç¯æä¸¤ç§æ ¼å¼ï¼ æ ¼å¼1ï¼ ``` for(åé in æ°ç») {è¯å¥} ``` 示ä¾ï¼ ``` awk 'BEGIN{ for(k in ENVIRON){ print k"="ENVIRON[k]; } }' TERM=linux G_BROKEN_FILENAMES=1 SHLVL=1 pwd=/root/text ... logname=root HOME=/root SSH_CLIENT=192.168.1.21 53087 22 ``` 注ï¼ENVIRONæ¯awk常éï¼æ¯åå ¸åæ°ç»ã æ ¼å¼2ï¼ ``` for(åé;æ¡ä»¶;表达å¼) {è¯å¥} ``` 示ä¾ï¼ ``` awk 'BEGIN{ total=0; for(i=0;i<=100;i++){ total+=i; } print total; }' 5050 ``` #### doå¾ªç¯ ``` do {è¯å¥} while(æ¡ä»¶) ``` ä¾åï¼ ``` awk 'BEGIN{ total=0; i=0; do {total+=i;i++;} while(i<=100) print total; }' 5050 ``` ### å ¶ä»è¯å¥ * **break** å½ break è¯å¥ç¨äº while æ for è¯å¥æ¶ï¼å¯¼è´éåºç¨åºå¾ªç¯ã * **continue** å½ continue è¯å¥ç¨äº while æ for è¯å¥æ¶ï¼ä½¿ç¨åºå¾ªç¯ç§»å¨å°ä¸ä¸ä¸ªè¿ä»£ã * **next** è½è½å¤å¯¼è´è¯»å ¥ä¸ä¸ä¸ªè¾å ¥è¡ï¼å¹¶è¿åå°èæ¬çé¡¶é¨ãè¿å¯ä»¥é¿å 对å½åè¾å ¥è¡æ§è¡å ¶ä»çæä½è¿ç¨ã * **exit** è¯å¥ä½¿ä¸»è¾å ¥å¾ªç¯éåºå¹¶å°æ§å¶è½¬ç§»å°END,妿ENDåå¨çè¯ãå¦ææ²¡æå®ä¹ENDè§åï¼æå¨ENDä¸åºç¨exitè¯å¥ï¼åç»æ¢èæ¬çæ§è¡ã ## æ°ç»åºç¨ æ°ç»æ¯awkççµéï¼å¤çææ¬ä¸æä¸è½å°çå°±æ¯å®çæ°ç»å¤çãå 为æ°ç»ç´¢å¼ï¼ä¸æ ï¼å¯ä»¥æ¯æ°ååå符串å¨awk䏿°ç»å«åå ³èæ°ç»(associative arrays)ãawk ä¸çæ°ç»ä¸å¿ æå声æï¼ä¹ä¸å¿ 声æå¤§å°ãæ°ç»å ç´ ç¨0æç©ºå符串æ¥åå§åï¼è¿æ ¹æ®ä¸ä¸æèå®ã ### æ°ç»çå®ä¹ æ°ååæ°ç»ç´¢å¼ï¼ä¸æ ï¼ï¼ ``` Array[1]="sun" Array[2]="kai" ``` åç¬¦ä¸²åæ°ç»ç´¢å¼ï¼ä¸æ ï¼ï¼ ``` Array["first"]="www" Array"[last"]="name" Array["birth"]="1987" ``` 使ç¨ä¸`print Array[1]`伿å°åºsunï¼ä½¿ç¨`print Array[2]`伿å°åºkaiï¼ä½¿ç¨`print["birth"]`ä¼å¾å°1987ã **è¯»åæ°ç»çå¼** ``` { for(item in array) {print array[item]}; } #è¾åºçé¡ºåºæ¯éæºç { for(i=1;i<=len;i++) {print array[i]}; } #Lenæ¯æ°ç»çé¿åº¦ ``` ### æ°ç»ç¸å ³å½æ° **å¾å°æ°ç»é¿åº¦ï¼** ``` awk 'BEGIN{info="it is a test";lens=split(info,tA," ");print length(tA),lens;}' 4 4 ``` lengthè¿ååç¬¦ä¸²ä»¥åæ°ç»é¿åº¦ï¼splitè¿è¡åå²å符串为æ°ç»ï¼ä¹ä¼è¿ååå²å¾å°æ°ç»é¿åº¦ã ``` awk 'BEGIN{info="it is a test";split(info,tA," ");print asort(tA);}' 4 ``` asort对æ°ç»è¿è¡æåºï¼è¿åæ°ç»é¿åº¦ã **è¾åºæ°ç»å å®¹ï¼æ åºï¼æåºè¾åºï¼ï¼** ``` awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}' 4 test 1 it 2 is 3 a ``` `forâ¦in`è¾åºï¼å 为æ°ç»æ¯å ³èæ°ç»ï¼é»è®¤æ¯æ åºçãæä»¥éè¿`forâ¦in`å¾å°æ¯æ åºçæ°ç»ã妿éè¦å¾å°æåºæ°ç»ï¼éè¦éè¿ä¸æ è·å¾ã ``` awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}' 1 it 2 is 3 a 4 test ``` 注æï¼æ°ç»ä¸æ æ¯ä»1å¼å§ï¼ä¸Cæ°ç»ä¸ä¸æ ·ã **夿é®å¼åå¨ä»¥åå é¤é®å¼ï¼** ``` #é误çå¤ææ¹æ³ï¼ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if(tB["c"]!="1"){print "no found";};for(k in tB){print k,tB[k];}}' no found a a1 b b1 c ``` 以ä¸åºç°å¥æªé®é¢ï¼`tB[âcâ]`没æå®ä¹ï¼ä½æ¯å¾ªç¯æ¶åï¼åç°å·²ç»åå¨è¯¥é®å¼ï¼å®çå¼ä¸ºç©ºï¼è¿ééè¦æ³¨æï¼awkæ°ç»æ¯å ³èæ°ç»ï¼åªè¦éè¿æ°ç»å¼ç¨å®çkeyï¼å°±ä¼èªå¨å建æ¹åºåã ```bash #æ£ç¡®å¤ææ¹æ³ï¼ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";if( "c" in tB){print "ok";};for(k in tB){print k,tB[k];}}' a a1 b b1 ``` `if(key in array)`éè¿è¿ç§æ¹æ³å¤ææ°ç»ä¸æ¯å¦å å«`key`é®å¼ã ```bash #å é¤é®å¼ï¼ awk 'BEGIN{tB["a"]="a1";tB["b"]="b1";delete tB["a"];for(k in tB){print k,tB[k];}}' b b1 ``` `delete array[key]`å¯ä»¥å é¤ï¼å¯¹åºæ°ç»`key`çï¼åºåå¼ã ### äºç»´ãå¤ç»´æ°ç»ä½¿ç¨ awkçå¤ç»´æ°ç»å¨æ¬è´¨ä¸æ¯ä¸ç»´æ°ç»ï¼æ´ç¡®åä¸ç¹ï¼awkå¨åå¨ä¸å¹¶ä¸æ¯æå¤ç»´æ°ç»ãawkæä¾äºé»è¾ä¸æ¨¡æäºç»´æ°ç»çè®¿é®æ¹å¼ãä¾å¦ï¼`array[2,4]=1`è¿æ ·çè®¿é®æ¯å 许çãawk使ç¨ä¸ä¸ªç¹æ®çå符串`SUBSEP(�34)`ä½ä¸ºåå²å段ï¼å¨ä¸é¢çä¾åä¸ï¼å ³èæ°ç»arrayåå¨çé®å¼å®é 䏿¯2�344ã 类似ä¸ç»´æ°ç»çæåæµè¯ï¼å¤ç»´æ°ç»å¯ä»¥ä½¿ç¨`if ( (i,j) in array)`è¿æ ·çè¯æ³ï¼ä½æ¯ä¸æ å¿ é¡»æ¾ç½®å¨åæ¬å·ä¸ã类似ä¸ç»´æ°ç»ç循ç¯è®¿é®ï¼å¤ç»´æ°ç»ä½¿ç¨`for ( item in array )`è¿æ ·çè¯æ³éåæ°ç»ãä¸ä¸ç»´æ°ç»ä¸åçæ¯ï¼å¤ç»´æ°ç»å¿ 须使ç¨`split()`彿°æ¥è®¿é®åç¬ç䏿 åéã ```bash awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ tarr[i,j]=i*j; print i,"*",j,"=",tarr[i,j]; } } }' 1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 ... 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81 ``` å¯ä»¥éè¿`array[k,k2]`å¼ç¨è·å¾æ°ç»å 容ã å¦ä¸ç§æ¹æ³ï¼ ```bash awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=9;j++){ tarr[i,j]=i*j; } } for(m in tarr){ split(m,tarr2,SUBSEP); print tarr2[1],"*",tarr2[2],"=",tarr[m]; } }' ``` ## å ç½®å½æ° awkå ç½®å½æ°ï¼ä¸»è¦å以ä¸3ç§ç±»ä¼¼ï¼ç®æ°å½æ°ãåç¬¦ä¸²å½æ°ãå ¶å®ä¸è¬å½æ°ãæ¶é´å½æ°ã ### ç®æ¯å½æ° | æ ¼å¼ | æè¿° | | ---- | ---- | | atan2( y, x ) | è¿å y/x ç忣åã | | cos( x ) | è¿å x çä½å¼¦ï¼x æ¯å¼§åº¦ã | | sin( x ) | è¿å x çæ£å¼¦ï¼x æ¯å¼§åº¦ã | | exp( x ) | è¿å x å¹å½æ°ã | | log( x ) | è¿å x çèªç¶å¯¹æ°ã | | sqrt( x ) | è¿å x å¹³æ¹æ ¹ã | | int( x ) | è¿å x çæªæè³æ´æ°çå¼ã | | rand( ) | è¿åä»»ææ°å nï¼å ¶ä¸ 0 <= n < 1ã | | srand( [expr] ) | å° rand 彿°çç§åå¼è®¾ç½®ä¸º Expr åæ°çå¼ï¼æå¦æçç¥ Expr åæ°åä½¿ç¨æå¤©çæ¶é´ãè¿åå åçç§åå¼ã | 举ä¾è¯´æï¼ ``` awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' 0.841 22026.466 2.303 3 ``` OFMT 设置è¾åºæ°æ®æ ¼å¼æ¯ä¿ç3ä½å°æ°ã è·å¾éæºæ°ï¼ ``` awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 78 awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 31 awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 41 ``` ### åç¬¦ä¸²å½æ° | æ ¼å¼ | æè¿° | | ---- | ---- | | gsub( Ere, Repl, [ In ] ) | é¤äºæ£åè¡¨è¾¾å¼ææå ·ä½å¼è¢«æ¿ä»£è¿ç¹ï¼å®å sub 彿°å®å ¨ä¸æ ·å°æ§è¡ã | | sub( Ere, Repl, [ In ] ) | ç¨ Repl åæ°æå®çåç¬¦ä¸²æ¿æ¢ In åæ°æå®çå符串ä¸çç± Ere åæ°æå®çæ©å±æ£å表达å¼ç第ä¸ä¸ªå ·ä½å¼ãsub 彿°è¿åæ¿æ¢çæ°éãåºç°å¨ Repl åæ°æå®çå符串ä¸ç &ï¼å符å·ï¼ç± In åæ°æå®çä¸ Ere åæ°çæå®çæ©å±æ£å表达å¼å¹é çåç¬¦ä¸²æ¿æ¢ãå¦ææªæå® In åæ°ï¼ç¼ºç弿¯æ´ä¸ªè®°å½ï¼$0 è®°å½åéï¼ã | | index( String1, String2 ) | å¨ç± String1 åæ°æå®çå符串ï¼å ¶ä¸æåºç° String2 æå®çåæ°ï¼ä¸ï¼è¿åä½ç½®ï¼ä» 1 å¼å§ç¼å·ã妿 String2 åæ°ä¸å¨ String1 åæ°ä¸åºç°ï¼åè¿å 0ï¼é¶ï¼ã | | length [(String)] | è¿å String åæ°æå®çå符串çé¿åº¦ï¼å符形å¼ï¼ã妿æªç»åº String åæ°ï¼åè¿åæ´ä¸ªè®°å½çé¿åº¦ï¼$0 è®°å½åéï¼ã | | blength [(String)] | è¿å String åæ°æå®çå符串çé¿åº¦ï¼ä»¥åè为åä½ï¼ã妿æªç»åº String åæ°ï¼åè¿åæ´ä¸ªè®°å½çé¿åº¦ï¼$0 è®°å½åéï¼ã | | substr( String, M, [ N ] ) | è¿åå ·æ N åæ°æå®çå符æ°éå串ãåä¸²ä» String åæ°æå®çå符串åå¾ï¼å ¶å符以 M åæ°æå®çä½ç½®å¼å§ãM åæ°æå®ä¸ºå° String åæ°ä¸ç第ä¸ä¸ªå符ä½ä¸ºç¼å· 1ãå¦ææªæå® N åæ°ï¼åå串çé¿åº¦å°æ¯ M åæ°æå®çä½ç½®å° String åæ°çæ«å°¾ çé¿åº¦ã | | match( String, Ere ) | å¨ String åæ°æå®çå符串ï¼Ere åæ°æå®çæ©å±æ£å表达å¼åºç°å¨å ¶ä¸ï¼ä¸è¿åä½ç½®ï¼å符形å¼ï¼ï¼ä» 1 å¼å§ç¼å·ï¼æå¦æ Ere åæ°ä¸åºç°ï¼åè¿å 0ï¼é¶ï¼ãRSTART ç¹æ®åé设置为è¿åå¼ãRLENGTH ç¹æ®åé设置为å¹é çå符串çé¿åº¦ï¼æå¦ææªæ¾å°ä»»ä½å¹é ï¼å设置为 -1ï¼è´ä¸ï¼ã| | split( String, A, [Ere] ) | å° String åæ°æå®çåæ°åå²ä¸ºæ°ç»å ç´ A[1], A[2], . . ., A[n]ï¼å¹¶è¿å n åéçå¼ãæ¤åéå¯ä»¥éè¿ Ere åæ°æå®çæ©å±æ£å表达å¼è¿è¡ï¼æç¨å½ååæ®µåé符ï¼FS ç¹æ®åéï¼æ¥è¿è¡ï¼å¦ææ²¡æç»åº Ere åæ°ï¼ãé¤éä¸ä¸æææç¹å®çå ç´ è¿åºå ·æä¸ä¸ªæ°åå¼ï¼å¦å A æ°ç»ä¸çå ç´ ç¨åç¬¦ä¸²å¼æ¥å建ã | | tolower( String ) | è¿å String åæ°æå®çå符串ï¼åç¬¦ä¸²ä¸æ¯ä¸ªå¤§ååç¬¦å°æ´æ¹ä¸ºå°åã大ååå°åçæ å°ç±å½åè¯è¨ç¯å¢ç LC_CTYPE èç´å®ä¹ã | | toupper( String ) | è¿å String åæ°æå®çå符串ï¼åç¬¦ä¸²ä¸æ¯ä¸ªå°ååç¬¦å°æ´æ¹ä¸ºå¤§åã大ååå°åçæ å°ç±å½åè¯è¨ç¯å¢ç LC_CTYPE èç´å®ä¹ã | | sprintf(Format, Expr, Expr, . . . ) | æ ¹æ® Format åæ°æå®ç printf åä¾ç¨æ ¼å¼åç¬¦ä¸²æ¥æ ¼å¼å Expr åæ°æå®ç表达å¼å¹¶è¿åæåçæçå符串ã | 注ï¼Ereé½å¯ä»¥æ¯æ£å表达å¼ã **gsub,sub使ç¨** ``` awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test! ``` å¨ info䏿¥æ¾æ»¡è¶³æ£å表达å¼ï¼`/[0-9]+/` ç¨`ââ`æ¿æ¢ï¼å¹¶ä¸æ¿æ¢åçå¼ï¼èµå¼ç»info æªç»infoå¼ï¼é»è®¤æ¯`$0` **æ¥æ¾å符串ï¼index使ç¨ï¼** ``` awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ok ``` æªæ¾å°ï¼è¿å0 **æ£å表达å¼å¹é æ¥æ¾(match使ç¨ï¼** ``` awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' ok ``` **æªåå符串(substr使ç¨ï¼** ``` [wangsl@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' s is a tes ``` ä»ç¬¬ 4个 å符å¼å§ï¼æªå10个é¿åº¦å符串 **å符串åå²ï¼split使ç¨ï¼** ``` awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4 4 test 1 this 2 is 3 a ``` åå²infoï¼å¨æå建æ°ç»tAï¼è¿éæ¯è¾æææï¼`awk for â¦in`循ç¯ï¼æ¯ä¸ä¸ªæ åºç循ç¯ã 并䏿¯ä»æ°ç»ä¸æ 1â¦n ï¼å æ¤ä½¿ç¨æ¶åéè¦æ³¨æã **æ ¼å¼åå符串è¾åºï¼sprintf使ç¨ï¼** æ ¼å¼ååç¬¦ä¸²æ ¼å¼ï¼ å ¶ä¸æ ¼å¼ååç¬¦ä¸²å æ¬ä¸¤é¨åå 容ï¼ä¸é¨åæ¯æ£å¸¸å符ï¼è¿äºåç¬¦å°æåæ ·è¾åº; å¦ä¸é¨åæ¯æ ¼å¼åè§å®å符ï¼ä»¥`"%"`å¼å§ï¼åè·ä¸ä¸ªæå 个è§å®å符,ç¨æ¥ç¡®å®è¾åºå å®¹æ ¼å¼ã | æ ¼å¼ | æè¿° | æ ¼å¼ | æè¿° | | ---- | ---- | ---- | ---- | | %d | åè¿å¶æç¬¦å·æ´æ° | %u | åè¿å¶æ ç¬¦å·æ´æ° | | %f | æµ®ç¹æ° | %s | å符串 | | %c | å个å符 | %p | æéçå¼ | | %e | ææ°å½¢å¼çæµ®ç¹æ° | %x | %X æ 符å·ä»¥åå è¿å¶è¡¨ç¤ºçæ´æ° | | %o | æ 符å·ä»¥å «è¿å¶è¡¨ç¤ºçæ´æ° | %g | èªå¨éæ©åéçè¡¨ç¤ºæ³ | ``` awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%on",n1,n2,n3,n1,n1);}' 124.11,18446744073709551615,1.2,7C,174 ``` ### ä¸è¬å½æ° | æ ¼å¼ | æè¿° | | ---- | ---- | | close( Expression ) | ç¨åä¸ä¸ªå¸¦å符串å¼ç Expression åæ°æ¥å ³éç± print æ printf è¯å¥æå¼çæè°ç¨ getline 彿°æå¼çæä»¶æç®¡éã妿æä»¶æç®¡éæåå ³éï¼åè¿å 0ï¼å ¶å®æ åµä¸è¿åéé¶å¼ã妿æç®åä¸ä¸ªæä»¶ï¼å¹¶ç¨åå¨åä¸ä¸ªç¨åºä¸è¯»åæä»¶ï¼å close è¯å¥æ¯å¿ éçã | | system(command ) | æ§è¡ Command åæ°æå®çå½ä»¤ï¼å¹¶è¿åéåºç¶æãçåäº system åä¾ç¨ã| | Expression `\|` getline [ Variable ] | 仿¥èª Expression åæ°æå®çå½ä»¤çè¾åºä¸éè¿ç®¡éä¼ éçæµä¸è¯»åä¸ä¸ªè¾å ¥è®°å½ï¼å¹¶å°è¯¥è®°å½ç弿å®ç» Variable åæ°æå®çåéã妿å½åæªæå¼å° Expression åæ°çå¼ä½ä¸ºå ¶å½ä»¤åç§°çæµï¼åå建æµãåå»ºçæµçåäºè°ç¨ popen åä¾ç¨ï¼æ¤æ¶ Command åæ°å Expression åæ°çå¼ä¸ Mode åæ°è®¾ç½®ä¸ºä¸ä¸ªæ¯ r çå¼ãåªè¦æµä¿çæå¼ä¸ Expression åæ°æ±å¾åä¸ä¸ªå符串ï¼å对 getline 彿°çæ¯æ¬¡åç»è°ç¨è¯»åå¦ä¸ä¸ªè®°å½ãå¦ææªæå® Variable åæ°ï¼å $0 è®°å½åéå NF ç¹æ®åéè®¾ç½®ä¸ºä»æµè¯»åçè®°å½ã| | getline [ Variable ] < Expression | ä» Expression åæ°æå®çæä»¶è¯»åè¾å ¥çä¸ä¸ä¸ªè®°å½ï¼å¹¶å° Variable åæ°æå®çåé设置为该记å½çå¼ãåªè¦æµä¿çæå¼ä¸ Expression 忰坹åä¸ä¸ªå符串æ±å¼ï¼å对 getline 彿°çæ¯æ¬¡åç»è°ç¨è¯»åå¦ä¸ä¸ªè®°å½ãå¦ææªæå® Variable åæ°ï¼å $0 è®°å½åéå NF ç¹æ®åéè®¾ç½®ä¸ºä»æµè¯»åçè®°å½ã | | getline [ Variable ] | å° Variable åæ°æå®çåé设置为ä»å½åè¾å ¥æä»¶è¯»åçä¸ä¸ä¸ªè¾å ¥è®°å½ãå¦ææªæå® Variable åæ°ï¼å $0 è®°å½åé设置为该记å½çå¼ï¼è¿å°è®¾ç½® NFãNR å FNR ç¹æ®åéã | **æå¼å¤é¨æä»¶ï¼closeç¨æ³ï¼** ``` awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ``` **éè¡è¯»åå¤é¨æä»¶(getlineä½¿ç¨æ¹æ³ï¼** ``` awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin ``` ``` awk 'BEGIN{print "Enter your name:";getline name;print name;}' Enter your name: chengmo chengmo ``` **è°ç¨å¤é¨åºç¨ç¨åº(systemä½¿ç¨æ¹æ³ï¼** ``` awk 'BEGIN{b=system("ls -al");print b;}' total 42092 drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . drwxr-xr-x 95 root root 4096 10-08 14:01 .. ``` bè¿åå¼ï¼æ¯æ§è¡ç»æã ### æ¶é´å½æ° | æ ¼å¼ | æè¿° | | ---- | ---- | | 彿°å | 说æ | | mktime( YYYY MM dd HH MM ss[ DST]) | çææ¶é´æ ¼å¼ | | strftime([format [, timestamp]]) | æ ¼å¼åæ¶é´è¾åºï¼å°æ¶é´æ³è½¬ä¸ºæ¶é´åç¬¦ä¸²å ·ä½æ ¼å¼ï¼è§ä¸è¡¨ã | | systime() | å¾å°æ¶é´æ³ï¼è¿åä»1970å¹´1æ1æ¥å¼å§å°å½åæ¶é´(ä¸è®¡é°å¹´)çæ´ç§æ° | **建æå®æ¶é´(mktime使ç¨ï¼** ``` awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' 2001å¹´01æ01æ¥ ææä¸ 12æ¶12å12ç§ ``` ``` awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' 2634468 ``` æ±2个æ¶é´æ®µä¸é´æ¶é´å·®ï¼ä»ç»äºstrftimeä½¿ç¨æ¹æ³ ``` awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' 308201392 ``` **strftimeæ¥æåæ¶é´æ ¼å¼è¯´æç¬¦** | æ ¼å¼ | æè¿° | | ---- | ---- | | %a | ææå ç缩å(Sun) | | %A | ææå ç宿´åæ³(Sunday) | | %b | æåç缩å(Oct) | | %B | æåç宿´åæ³(October) | | %c | æ¬å°æ¥æåæ¶é´ | | %d | åè¿å¶æ¥æ | | %D | æ¥æ 08/20/99 | | %e | æ¥æï¼å¦æåªæä¸ä½ä¼è¡¥ä¸ä¸ä¸ªç©ºæ ¼ | | %H | ç¨åè¿å¶è¡¨ç¤º24å°æ¶æ ¼å¼çå°æ¶ | | %I | ç¨åè¿å¶è¡¨ç¤º12å°æ¶æ ¼å¼çå°æ¶ | | %j | ä»1æ1æ¥èµ·ä¸å¹´ä¸ç第å 天 | | %m | åè¿å¶è¡¨ç¤ºçæä»½ | | %M | åè¿å¶è¡¨ç¤ºçåé | | %p | 12å°æ¶è¡¨ç¤ºæ³(AM/PM) | | %S | åè¿å¶è¡¨ç¤ºçç§ | | %U | åè¿å¶è¡¨ç¤ºçä¸å¹´ä¸ç第å 个ææ(ææå¤©ä½ä¸ºä¸ä¸ªææçå¼å§) | | %w | åè¿å¶è¡¨ç¤ºçææå (ææå¤©æ¯0) | | %W | åè¿å¶è¡¨ç¤ºçä¸å¹´ä¸ç第å 个ææ(ææä¸ä½ä¸ºä¸ä¸ªææçå¼å§) | | %x | éæ°è®¾ç½®æ¬å°æ¥æ(08/20/99) | | %X | éæ°è®¾ç½®æ¬å°æ¶é´(12:00:00) | | %y | 䏤使°å表示çå¹´(99) | | %Y | å½åæä»½ | | %% | ç¾åå·(%) |