




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
AWK基礎理論AWK是一種自解釋的編程語言,主要用來處理數據和產生報表。它對輸入數據(文件、標準輸入或命令的輸出)逐行進行掃描,匹配指定的模式,并執行指定的操作。本章的內容:抽取域匹配正則表達式比較域向AWK傳遞參數基本的AWK行操作和腳本調用AWK命令行方式awk[-Ffield-separator]‘pattern{action}’filenameawk掃描filename中的每一行,對符合模式pattern的行執行操作action.特例:awk‘pattern’filename//顯示所有符合模式pattern的行awk‘{action}’filename//對所有行執行操作action當未指定輸入數據來源filename,缺省情況下從標準輸入設備(鍵盤)讀取數據.鍵盤上每輸入一行,awk就處理一行,直到遇到^D為止.[-Ffield-separator]:可選項;空格是默認域分隔符,如果域分隔符是空格,不比指定該項在查找包含空格的字符串(如MaryAdams)時要特別小心該空格的狀況,是一個、兩個、多個或Tab符。為避免可能出現的混淆,實際應用中常把域分隔符設置為可見字符,如分號(;)或冒號(:)這種方法同時也節省大量的存儲空間.將所有awk命令插入一個文件,將awk命令解釋器作為腳本的首行,并使awk程序可執行。將所有的awk命令插入一個單獨文件awk-script-file,然后調用awk-fawk-script-fileinput-file(s)awk腳本awk腳本由模式和各種操作(動作)組成。模式和動作模式:決定動作語句何時觸發及觸發事件。可以是任何條件語句、復合語句、正則表達式包括兩個特殊字段:BEGIN和ENDBEGIN:使用在任何文本瀏覽動作之前,之后文本瀏覽動作依據輸入文件開始執行END語句:用來在awk完成文本瀏覽動作后打印輸出文本總數和結尾狀態標志。如果不特別指明模式,awk總是匹配或打印行數。如果省略模式部分,動作將時刻保持執行狀態。動作:對數據進行的操作。動作在{}內指明。如果不指明采取動作,awk將打印出所有瀏覽出來的記錄。域和記錄域標識:$1,$2……$n注意用“,”做域分隔$0表示所有域如下信息保存在grade.txt:名字升段日期學生序號腰帶級別年齡目前比賽積分比賽最高分M.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/9948Yellow123528J.Troll07/994842Brown-3122626L.Tansley05/994712Brown-2123028保存awk的輸出:awk‘{print$0}’grade.txt>wow//使用重定向符把awk的輸出保存到wow文件awk‘{print$0}’grade.txt|teewow//輸出重定向到wow的同時輸出到屏幕使用標準輸入:belts.awkgrade.txt//使用awk腳本輸入文件方式belts.awk<grade.txt//使用重定向方式grade.txt|belts.awk//使用管道方法打印記錄:awk‘{print$0}grade.txt//打印所有記錄awk‘{print$1,$4}grade.txt//打印單獨記錄#awk'BEGIN{print"namebelts\n----------------------"}{print$1"\t"$4}'grade.txt//打印報告頭namebelts----------------------M.TansleyGreenJ.LulugreenP.BunnyYellowJ.TrollBrown-3L.TansleyBrown-2#awk'BEGIN{print"name\n-----------"}{print$1}END{print"end-of-report"}'grade.txtname-----------M.TansleyJ.LuluP.BunnyJ.TrollL.Tansleyend-of-report規則:確保整個awk命令用單引號括起來確保命令內所有引號成對出現確保用花括號{}括起動作語句,用圓括號()括起條件語句awk中正則表達式及其操作awk的正則表達式用斜線“//”括起來。元字符awk中正則表達式匹配操作中經常用到的字符:\^$.[]|()*+?+匹配一個或多個字符這兩個字符不適用于grep或sed?匹配模式出現頻率條件操作符<<===!=>>=~(匹配)!~(不匹配)1)匹配#awk'{if($4~/Brown/)print$0}'grade.txtJ.Troll07/994842Brown-3122626L.Tansley05/994712Brown-2123028某一域匹配正則表達式,用“~”后緊跟正則表達式awk中if后面的條件用()括起來2)精確匹配#awk'{if($3~/48/)print$0}'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/9948Yellow123528J.Troll07/994842Brown-3122626#awk'{if($3=="48")print$0}'grade.txt或#awk'$3=="48"{print$0}'grade.txtP.Bunny02/9948Yellow123528精確匹配用“==”,并用引號括起字符串3)不匹配#awk'{if($4!~/Brown/)print$0}'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/9948Yellow123528#awk'$4!~/Brown/'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/9948Yellow123528缺省情況下,awk將打印所有匹配記錄,因此不必加入動作部分#awk‘$4!=“brown”{print$0}’grade.txt上面返回錯誤結果,因為用引號括起來brown,將只匹配brown而不匹配brown-2和brown-3!4)<<=>>=awk‘{if($6>$7)print$1}’grade.txt5)設置大小寫#awk'$0~/[gG]reen/'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green924266)任意字符#awk'$1~/^...a/'grade.txtM.Tansley05/9948311Green84044L.Tansley05/994712Brown-2123028/^...a/表示行首前3個字符任意,第四個是a,“^”表示行首7)或關系#awk'$0~/Yellow|Brown/'grade.txtP.Bunny02/9948Yellow123528J.Troll07/994842Brown-3122626L.Tansley05/994712Brown-2123028#awk'$0~/green|Green/'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426“|”:匹配兩邊模式之一8)復合操作符||&&!awk內置變量ARGC命令行參數個數ARGV命令行參數排列ARGV[n]ENVIRON支持隊列中系統環境變量的使用ENVIRON[“EDITOR”]=“vi”FILENAMEAwk瀏覽的文件名FNR瀏覽文件的記錄數<=NR,每一次新輸入文件都被重置NF瀏覽記錄的域個數NR已讀的記錄數FS設置輸入域分隔符,等價于命令行-F選項FS=“,”RS記錄分隔符缺省為新行“\n”OFS輸出域分隔符ORS輸出記錄分隔符缺省為新行“\n”#awk'{printNR"\t"NF"\t"$0}END{printFILENAME}'grade.txt17M.Tansley05/9948311Green8404427J.Lulu06/9948317green9242637P.Bunny02/9948Yellow12352847J.Troll07/994842Brown-312262657L.Tansley05/994712Brown-2123028#awk'{if(NR>0&&$4~/Brown/)print$0}'grade.txtJ.Troll07/994842Brown-3122626L.Tansley05/994712Brown-2123028在從文件中抽取信息時,最好首先檢查文件中是否有記錄。#echo$PWD|awk-F/'{print$NF}'myAWKawk操作符=+=*=/=%=^=賦值操作符?條件表達操作符||&&!并、與、非~!~匹配操作符<<===!=>>=關系操作符+-*/%^算數操作符++--前綴、后綴1)給輸入域設置域變量名#awk'{name=$1;belts=$4;if(belts~/Yellow/)printname"isbelt"belts}'grade.txtP.BunnyisbeltYellow設置有意義的域名易于在進行模式匹配或關系操作時理解。一般格式為:name=$n另外,awk動作部分如果有多個語句用分號分開。2)域值比較操作#awk'BEGIN{BASELINE="27"}{if($6>BASELINE)print$0}'grade.txtM.Tansley05/9948311Green84044P.Bunny02/9948Yellow123528L.Tansley05/994712Brown-2123028在BEGIN部分賦值可以減少表達式改動時的麻煩!3)修改數值域取值當在awk中修改任何域時,重要的一點是要記住實際輸入文件是不可修改的,修改的只是保存在緩存里的awk復本。#awk'{if($1=="M.Tansley")$6=$6-1;print$1,$6,$7}'grade.txtM.Tansley3944J.Lulu2426P.Bunny3528J.Troll2626L.Tansley30284)修改文本域#awk'{if($1=="J.Troll")($1="J.L.Troll");print$1,$6,$7}'grade.txtM.Tansley4044J.Lulu2426P.Bunny3528J.L.Troll2626L.Tansley3028修改文本域就是對其重新賦值。用引號“”將字符串括起來,并用圓括號括起整個語法。(實際測試沒有圓括號也正確)5)只顯示修改記錄#awk'{if($1=="J.Troll"){$1="J.L.Troll";print$1,$6,$7}}'grade.txtJ.L.Troll2626在模式后面使用花括號{}將只打印修改部分!取得模式,再根據模式結果實施操作。6)創建新的輸出域#awk'BEGIN{print"Name\tDifference"}{if($6<$7){$8=$7-$6;print$1,$8}}'grade.txtNameDifferenceM.Tansley4J.Lulu2#awk'BEGIN{print"Name\tDifference"}{if($6<$7){diff=$7-$6;print$1,diff}}'grade.txtNameDifferenceM.Tansley4J.Lulu27)增加列值為了增加列數或進行運行結果統計,使用符號+=.#awk'(tot+=$6);END{print"Clubstudenttotalpoints:"tot}'grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426P.Bunny02/9948Yellow123528J.Troll07/994842Brown-3122626L.Tansley05/994712Brown-2123028Clubstudenttotalpoints:155#awk'{(tot+=$6)};END{print"Clubstudenttotalpoints:"tot}'grade.txtClubstudenttotalpoints:155##awk'{tot+=$6};END{print"Clubstudenttotalpoints:"tot}'grade.txtClubstudenttotalpoints:1558)文件長度相加#lltotal4-rw-r--r--.1rootroot225Jul1211:23grade.txt##ls-l|awk'/^[^d]/{print$9"\t"$5;tot+=$5}END{"totalKB:"tot}'grade.txt225正則表達式^[^d]表示剔除首字符為d的記錄內置的字符串函數gsub(r,s)在整個$0中用s替代rGsub函數有點類似于sed查找和替換,它容許替換一個字符串或字符為另一個字符串或字符,并以正則表達式的形式執行。#awk'gsub(/4842/,4899){print$0}'grade.txtJ.Troll07/994899Brown-31226262)index(s,t)返回s中字符串t的第一位置必須用雙引號將字符串括起來!#awk'BEGIN{printindex("Bunny","ny")}'grade.txt4#awk'{printindex("Bunny","ny")}'grade.txt//?444443)length(s)返回s長度#awk'{if($1=="J.Troll")printlength($1),$1}'grade.txt7J.Troll#awk'BEGIN{printlength("afewgoodmen")}'//字符串用引號括起來14#awk'{printlength("afewgoodmen")}'//?執行后一直沒返回,最后用ctl+c退出^Cmatch(s,r)測試s是否包括匹配r的字符串#awk'BEGIN{printmatch("ANCD",/d/)}'0#awk'BEGIN{printmatch("ANCD",/D/)}'4#awk'$1=="J.Lulu"{printmatch($1,"u")}'grade.txt4Split(s,a,fs)使用分隔符fs將字符串s分成序列a,返回字符串數組元素個數#awk'BEGIN{printsplit("2014-07-14",date,"-")}'35)Sub(r,s)用$0中最左邊最長的字串代替s?6)Substr(s,p)返回字符串s中從p開始的后綴部分Substr(s,p,n)返回字符串s中從p開始長度為n的后綴部分#awk'$1=="J.Lulu"{printsubstr($1,1,3)}'grade.txtJ.L#awk'{printsubstr($1,3)}'grade.txtTansleyLuluBunnyTrollTansley#awk'BEGIN{str1="afewgoodmen"}END{printsubstr(str1,3)}'//執行后不返回從shell中向awk傳入字符串Awk腳本大多只有一行,其中很少是字符串表示的。#echo"stand-by"|awk'{printlength($0)}'8#echo$str1|awk'{printsubstr($str1,1,5)}'abcde字符串屏蔽序列\b退格鍵\f換頁\n新行\r回車鍵\tTab鍵\ddd八進制值\c任意其他特殊字符反斜線:\\使用正則表達式,查詢花括號:/\{/Awk輸出函數printf高級格式化輸出函數.用法與C語言中的用法相同.printf([格式控制符],參數)格式控制符通常在引號里,以一個%開始,以一個決定轉換的字符結束。printf修飾符-左對齊width域的步長,用0表示0步長prec最大字符串長度,或小數點右邊的位數printf格式%cASCII字符%d整數%e浮點數,科學計數法%f浮點數,例如123.45%gAwk決定使用哪種浮點數格式%o八進制%s字符串%x十六進制1)字符轉換#echo65|awk'{printf("%c\n",$0)}'A#awk'BEGIN{printf("%c\n",65)}'A#awk'BEGIN{printf("%f\n",65)}'65.000000格式化輸出#awk'{printf("%-15s%s\n",$1,$3)}'grade.txtM.Tansley48311J.Lulu48317P.Bunny48J.Troll4842L.Tansley4712#awk'BEGIN{print"name\t\tnumber\n-------------------------"}{printf("%-15s%s\n",$1,$3)}'grade.txtnamenumber-------------------------M.Tansley48311J.Lulu48317P.Bunny48J.Troll4842L.Tansley4712#awk‘{printf“uname:%-8sID:%6d\n”,$1,$3}’employeesuname:TomID:4424uname:MaryID:5346uname:SallyID:1654uname:BillyID:1683向一行awk命令傳值在awk執行前將值傳入awk變量,需要將變量放在命令行中,格式:awk命令變量=傳入文件值#awk'{if($5<AGE)print$0}'AGE=10grade.txtM.Tansley05/9948311Green84044J.Lulu06/9948317green92426#df-kFilesystem1K-blocksUsedAvailableUse%Mountedon/dev/mapper/VolGroup-lv_root51606140222778162670688446%/tmpfs4023516040235160%/dev/shm/dev/sda14958445422641601812%/boot/dev/mapper/VolGroup-lv_home35974792442012337053522%/home#df-k|awk'($4~/^[0-9]/){if($4>TRIGGER)printf("%-15s%s\n",$6,$4)}'TRIGGER=56000/dev/shm4023516/boot416018awk允許傳入環境變量:#who|awk'{if($1==user)print$1"youareconnectingto"$2}'user=$LOGNAMErootyouareconnectingtottyS0rootyouareconnectingtopts/1awk腳本(awk命令文件)格式:awk-fawk_filedata_file當需要對輸入數據中的一行執行多項操作時,常把這些操作命令放在一個命令文件中,而不是在命令行上發出.awk運行時,對輸入數據中的每一行執行命令文件中的所有操作后,再對下一行數據進行同樣的處理過程,依此類推,直到輸入數據的最后一行.(要特別注意操作順序和流程)實例:$catmy_awk/Sally/{print“****foundSally!****”}{print$1,$2,$3}$awk-fmy_awkemployees****foundSally!****SallyChang1654awk數組Summary命令行格式:awk[-Ffield-separator]‘pattern{action}’filename模式可以是任何條件語句、復合語句、正則表達式(用斜線“//”括起來)。包括兩個特殊字段:BEGIN和END動作在{}內指明。如果不指明采取動作,awk將打印出所有瀏覽出來的記錄。域標識:$1,$2……$n注意用“,”做域分隔$0表示所有域操作符:?條件表達操作符||&&!邏輯操作符~!~匹配操作符<<===!=>>=關系操作符+-*/%^++--算術操作符=+=*=/=%=^=賦值操作符關系操作符、匹配操作符、邏輯操作符用于表達復雜的模式,如awk'{if($4~/Brown/)print$0}'grade.txtawk'$0~/Yellow|Brown/'grade.txt算術、賦值用于action部分,可以增加列值awk'{if($1=="M.Tansley")$6=$6-1;print$1,$6,$7}'grade.txtawk'BEGIN{print"Name\tDifference"}{if($6<$7){$8=$7-$6;print$1,$8}}'grade.txtawk有一些內置變量:ARGC、ARGV、ENVIRON、FILENAME、FNR、FS、NF、NR、OFS、ORS、RSawk有一些內置字符串函數:gsub(r,s)、index(s,t)、length(s)、match(s,r)、substr(s,p)、printf([格式控制符],參數)AWK筆試題獲取本機的IP地址和掩碼#cat/etc/sysconfig/network-scripts/ifcfg-eth0DEVICE="eth0"BOOTPROTO="static"HWADDR="EC:9E:CD:0E:7C:E8"NM_CONTROLLED="yes"ONBOOT="no"TYPE="Ethernet"UUID="9a975e2c-dabc-4c5e-91ca-56521a409dd8"NAME="eth0"ONBOOT=yesIPADDR=2PREFIX=16GATEWAY=54#!/bin/bash#ThisscriptprintIPandMASKfile="/etc/sysconfig/network-scripts/ifcfg-eth0"if[-f$file]thenip=`grepIPADDR$file|awk-F='{print$2}'`mask=`grepNETMASK$file|awk-F='{print$2}'`if[-z$mask]thenecho"$ip"elseecho"$ip/$mask"fielseecho"$fileisnotexist!"fi文本分析取出password中shell出現的次數第一種方法結果:4/bin/bash1/bin/sync1/sbin/halt31/sbin/nologin1/sbin/shutdown第二種方法結果:/bin/sync1/bin/bash1/sbin/nologin30/sbin/halt1/sbin/shutdown1#awk-F:'{print$NF}'/etc/passwd|sort|uniq-c4/bin/bash1/bin/sync1/sbi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司白天集體活動方案
- 公司登山活動方案
- 公司聚餐嗨活動方案
- 公司美食大賽活動方案
- 公司肉孜節慰問活動方案
- 公司晚上團建策劃方案
- 公司無煙宣傳活動方案
- 公司節氣活動方案
- 公司法制教育活動方案
- 公司自我推廣活動方案
- 戶外田園早教課程設計
- 兒科危重癥護理習題題庫含答案
- DL∕T 5138-2014 電力工程數字攝影測量規程
- DL∕T 550-2014 地區電網調度控制系統技術規范
- 2022-2023學年湖北省隨州市曾都區人教PEP版五年級下冊期末學業質量監測英語試卷
- 鋼結構施工合同范本
- 2024年內蒙古錫林郭勒盟事業單位人才引進歷年【重點基礎提升】模擬試題(共500題)附帶答案詳解
- 建設工程監理安全資料臺帳建筑施工
- 浙江省溫州市鹿城區2023-2024學年八年級下學期科學期末質量檢測綜合模擬卷
- 大樹吊裝專項施工方案
- (XX)XX縣2021年度變更調查技術設計書
評論
0/150
提交評論