根據運行的環境,操作系統可以分為桌面操作系統,手機操作系統,服務器操作系統,嵌入式操作系統等。 -W幫助或--help,-W使用情況或--usage 打印所有awk選項和每個選項的簡短說明. -W棉絨或--lint 打印有關無法移植到傳統unix平臺的結構的警告. -W舊皮棉或--lint舊皮 打印有關無法移植到傳統unix平臺的結構的警告. -W posix 打開兼容模式. 但是,它具有以下限制,無法識別: \ x,function關鍵字,func,轉義序列,并且當fs是空格時,新行用作字段分隔符;運算符**和** =不能替換^和^ =; fflush無效. -W重新間隔或--re-inerval 允許使用間隔正則表達式,請參閱(grep中的Posix字符類),例如方括號表達式[[: alpha: ]]. -W源程序文本或--source程序文本 使用program-text作為源代碼,可以將其與-f命令混合使用. -W版本或--version 打印錯誤報告信息的版本. awk腳本由模式和操作組成: 模式{action},例如$ awk'/ root /'測試或$ awk'$ 3 <> 兩者都是可選的. 如果沒有模式,則該操作將應用于所有記錄. 如果不執行任何操作,則輸出匹配所有記錄. 默認情況下,每條輸入行都是一條記錄,但是用戶可以指定不同的分隔符以用RS變量進行分隔. 該模式可以是以下任意一種: 該操作由一個或多個命令,函數和表達式組成,用換行符或分號隔開,并位于花括號內. 主要包括四個部分: Table1.awk環境變量 變量描述 $ n 當前記錄的第n個字段,以FS分隔. $ 0 完成輸入記錄. ARGC 命令行參數數. ARGIND 當前文件在命令行上的位置(從0開始計數). ARGV 包含命令行參數的數組. CONVFMT 數字轉換格式(默認為%.6g) ENVIRON 環境變量的關聯數組. ERRNO 最后一次系統錯誤的描述. FIELDWIDTHS 字段寬度列表(用空格鍵分隔). 文件名 當前文件名. FNR 與NR相同,但相對于當前文件. FS 字段分隔符(默認為任何空格). IGNORECASE 如果為true,則無論大小寫匹配都會被忽略. NF 當前記錄中的字段數. NR 當前記錄號. OFMT 數字輸出格式(默認為%.6g). OFS 輸出字段分隔符(默認為空格). ORS 輸出記錄分隔符(默認為換行符). 長度 由match函數匹配的字符串的長度. RS 記錄分隔符(默認為換行符). RSTART 匹配功能匹配的字符串的第一個位置. SUBSEP 數組下標分隔符(默認為\ 034). 表2. 運營商 操作員說明 = + =-= * = / =%= ^ = ** = 分配 C條件表達式 || 邏輯或 && 邏輯與 ??! 匹配正則表達式和不匹配正則表達式 <=>> =!= ==
關系運算符 空格 連接 +- 加減 * /& 乘法,除法和余數 +-! 一元加法,減法和邏輯求反 ^ *** 擴展電源 ++- 增加或減少前綴或后綴 $ 字段參考 在 數組成員 awk引用以換行符結尾的每一行作為記錄. 記錄分隔符: 默認的輸入和輸出分隔符均為回車符,它們保存在內置變量ORS和RS中. $ 0變量: 它引用整個記錄. 例如,$ awk'{print $ 0}'測試將在測試文件中輸出所有記錄. 變量NR: 計數器. 處理每個記錄后,NR的值增加1. 例如awk數組長度,$ awk'{print NR,$ 0}'測試將輸出測試文件中的所有記錄,并在記錄前顯示記錄號. 記錄中的每個單詞都稱為“域”,默認情況下用空格或制表符分隔. Awk可以跟蹤域的數量,并將其值保存在內置變量NF中. 例如,$ awk'{print $ 1,$ 3}'測試將打印測試文件中用空格分隔的第一和第三列(字段). 內置變量FS保存輸入字段分隔符的值. 默認值為空格或制表符. 我們可以通過-F命令行選項修改FS的值. 例如,$ awk -F: '{print $ 1,$ 5}'測試將打印由冒號分隔的第一和第五列的內容. 可以同時使用多個域分隔符. 在這種情況下,分隔符應寫在方括號中,例如$ awk -F'[: \ t]''{print $ 1,$ 3}'測試,這意味著將space,冒號和制表符作為分隔符. 默認情況下,輸出字段的分隔符為空格,并存儲在OFS中. 例如,在$ awk -F: '{print $ 1,$ 5}'測試中,$ 1和$ 5之間的逗號是OFS值. 以下內容專用于gawk,不適用于unix版本的awk. \ Y 在單詞的開頭或結尾匹配一個空字符串. \ B 匹配單詞中的空字符串. \ 在單詞開頭匹配一個空字符串,然后開始定位. \> 在單詞的末尾匹配一個空字符串,并在末尾定位. \ w 匹配字母數字單詞. \ W 匹配一個非字母數字的單詞. \’ 在字符串的開頭匹配一個空字符串. \' 在字符串末尾匹配一個空字符串. 用于匹配記錄或域中的正則表達式. 例如,$ awk'$ 1?/ ^ root /'test將在測試文件的第一列中顯示以root開頭的行. 條件表達式1? expression2: expression3,例如: $ awk'{max = {$ 1> $ 3}? $ 1: $ 3: print max}測試. 如果第一個字段大于第三個字段,則將$ 1分配給max,否則將$ 3分配給max. $ awk'$ 1 + $ 2 <100'測試.>100'測試.> $ awk'$ 1> 5 && $ 2 <> 范圍模板匹配從第一個模板的第一次出現到第二個模板的第一次出現的所有行. 如果沒有出現模板,則它與開頭或結尾匹配. 例如,$ awk'/ root /,/ mysql /'test將顯示在root第一次出現和mysql第一次出現之間的所有行. $ cat / etc / passwd | awk -F: '\ NF!= 7 {\ printf(“第%d行,沒有7個字段: %s \ n”,NR,$ 0)} \ $ 1!?/ [A-Za-z0-9] / {printf(“行%d,非字母和數字用戶ID: %d: %s \ n,NR,$ 0)} \ $ 2 ==” *“ {printf(”第%d行,沒有密碼: %s \ n“,NR,$ 0)}' cat將結果輸出到awk,awk將域之間的分隔符設置為冒號. 如果域數(NF)不等于7,請執行以下步驟. printf打印字符串“第??行沒有7個字段”并顯示記錄. 如果第一個字段不包含任何字母和數字,則printf打印“無字母和數字用戶ID”,并顯示記錄和記錄的數量. 如果第二個字段是星號,則打印字符串“ no passwd”,后跟記錄數和記錄本身. BEGIN模塊后面是一個動作塊,該動作塊在awk處理任何輸入文件之前執行. 因此無需任何輸入即可對其進行測試. 通常用于更改內置變量(例如OFS,RS和FS)的值,以及打印標題. 例如: $ awk'BEGIN {FS =“: ”; OFS =“ \ t”; ORS =“ \ n \ n”} {打印$ 1,$ 2,$ 3}測試. 上面的表達式表示在處理輸入文件之前,將字段分隔符(FS)設置為冒號,將輸出文件分隔符(OFS)設置為制表符,并將輸出記錄分隔符(ORS)設置為兩個換行符. $ awk'BEGIN {print“ TITLE TEST”}}僅打印標題. END與任何輸入文件都不匹配,但是執行動作塊中的所有動作,它在處理完整個輸入文件后執行. 例如,$ awk'END {print“記錄數為” NR}“測試,上面的公式將打印所有已處理記錄的數. awk中的條件語句是從C語言借來的,可以控制程序的流程. 14.5.1.if語句 格式: {if (expression){ statement; statement; ... } } $ awk'{if($ 1 <$ 2)print="" $="" 2“="" too="" high”}'測試.="">$> $ awk'{if($ 1 <$ 2){count="" ++;打印“確定”}}'測試.="">$> 14.5.2.if / else語句,用于雙重判斷 格式: {if (expression){ statement; statement; ... } else{ statement; statement; ... } } $ awk'{if($ 1> 100)print $ 1“ bad”;否則打印“確定”}'測試. 如果$ 1大于100,則打印$ 1錯誤,否則打印確定. $ awk'{if($ 1> 100){count ++;打印$ 1} else {count--;打印$ 2}”測試. 如果$ 1大于100,則將count加1,然后打印$ 1,否則將count加1,然后打印$ 1. 14.5.3.if / else else if語句,用于多個判斷. 格式: {if (expression){ statement; statement; ... } else if (expression){ statement; statement; ... } else if (expression){ statement; statement; ... } else { statement; statement; ... } } awk中數組的下標可以是數字和字母,稱為關聯數組. 14.7.1. 下標和關聯數組 14.8.1. 字符串函數 14.8.2. 時間功能 14.8.3. 內置數學函數 表4. 函數名稱返回值 atan2(x,y) 在y,x范圍內的余切 cos(x) 余弦函數 exp(x) 擴展電源 int(x) 圓形 log(x) 自然對數 rand() 隨機數 sin(x) 正弦 sqrt(x) 平方根 品牌(x) x是rand()函數的 int(x) 舍入,沒有舍入 rand() 生成一個大于或等于0且小于1的隨機數 14.8.4. 自定義功能 您還可以在awk中自定義函數,格式如下: function name ( parameter, parameter, parameter, ... ) { statements return expression # the return statement and expression are optional } 通常,當awk中有多個輸入文件時,NR == FNR是有意義的. 如果該值為true,則表示第一個文件仍在處理中. NR == FNR通常用于讀取兩個或多個文件,并用于判斷是否正在讀取第一個文件. test.txt 10行內容 test2.txt 4行內容 awk'{print NR,FNR}'test.txt test2.txt 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 1 12 2 13 3 14 4 現在有兩種文件格式,如下所示: #cat帳戶 張三| 000001 李思| 000002 #cat cdr 000001 | 10 000001 | 20 000002 | 30 000002 | 15 所需的結果是在同一行上打印用戶名,帳號和金額,如下所示: 張三| 000001 | 10 張三| 000001 | 20 李思| 000002 | 30 李思| 000002 | 15 執行以下代碼 #awk -F \ |'NR == FNR {a [$ 2] = $ 0; next} {打印a [$ 1]“ |” $ 2}'帳戶cdr 評論: 當NR = FNR為true時,判斷當前正在讀取第一個文件帳戶,然后使用{a [$ 2] = $ 0; next}循環將帳戶文件的每一行存儲到數組a中,并使用$ 2的第二個字段作為下標引用. 當NR = FNR為false時,判斷當前正在讀取第二個文件cdr,然后跳過{a [$ 2] = $ 0; next},無條件執行{打印第二個文件cdr a [的每一行] $ 1]“ ||” $ 2},這時變量$ 1是第二個文件的第一個字段,并且在讀取第一個文件時,第一個文件$ 2的第二個字段用作數組下標. 因此,您可以在此處使用[[1]]來引用該數組. awk'{gsub(/ \ $ /,“”); gsub(/,/,“”); 如果($ 1> = 0.1 && $ 1 <0.2)c1 +="">0.2)c1> 否則($ 1> = 0.2 && $ 1 <0.3)c2 +="">0.3)c2> 否則($ 1> = 0.3 && $ 1 <0.4)c3 +="">0.4)c3> 否則($ 1> = 0.4 && $ 1 <0.5) +="">0.5)> 否則($ 1> = 0.5 && $ 1 <0.6)c5 +="">0.6)c5> 否則($ 1> = 0.6 && $ 1 <0.7)c6 +="">0.7)c6> 否則($ 1> = 0.7 && $ 1 <0.8)c7 +="">0.8)c7> 否則($ 1> = 0.8 && $ 1 <0.9)c8 +="">0.9)c8> 否則($ 1> = 0.9)c9 + = 1; else c10 + = 1; } END {printf“%d \ t%d \ t%d \ t%d \ t%d \ t%d \ t%d \ t%d \ t%d \ t%d \ t”,c1 ,c2,c3,,c5,c6,c7,c8,c9,c10}'/ NEW 示例/示例: awk'{if($ 0?/^>.*$/){tmp = $ 0; getline; if(length($ 0)> = 200){print tmp“ \ n” $ 0;}}}'文件名 awk'{if($ 0?/^>.*$/){IGNORECASE = 1; if($ 0?/ PREDICTED /){getline;} else {打印$ 0; getline;打印$ 0;}}}'文件名 awk'{if($ 0?/^>.*$/){IGNORECASE = 1; if($ 0?/ mRNA /){打印$ 0; getline;打印$ 0;} else {getline;}}}'文件名 awk'{temp = $ 0; getline; if($ 0?/ unavailable /){;} else {print temp“ \ n” $ 0;}}'文件名 substr($ 4,20)--->表示它從第4個字段中的第20個字符開始,一直持續到設置的分隔符“,”結束. substr($ 3,12,8)--->表示它從第三個字段中的第12個字符開始,以截獲的8個字符結束. 一個awk字符串到數字 $ awk'BEGIN {a =“ 100”; b =“ 10test10”; print(a + b + 0);}' 110 您只需要通過“ +”操作連接變量. 自動將字符串強制為整數. 非數字變為0,找到第一個非數字字符,以后將自動忽略它. 兩個,awk數字將轉換為字符串 $ awk'BEGIN {a = 100; b = 100; c =(a“” b);打印c}' 100100 只需將變量與“”符號連接即可進行計算. 三awk數組長度,awk字符串串聯操作(字符串串聯;鏈接;串聯) $ awk'BEGIN {a =“ a”; b =“ b”; c =(a“” b);打印c}' ab $ awk'BEGIN {a =“ a”; b =“ b”; c =(a + b); print c}' 連接文件中的行: awk'BEGIN {xxxx =“”;} {xxxx =(xxxx“” $ 0);} END {print xxxx}'temp.txt awk'BEGIN {xxxx =“”;} {xxxx =(xxxx“ \”,\“” $ 0);} END {print xxxx}'temp.txt 提取符合條件的子字符串: cat>臨時 74938 A> G 347589B> 3795743 awk'{x = $ 0; while(match(x,“ [AZ]> [AZ]”])> 0){print substr(x,RSTART,RLENGTH); x = substr(x,RSTART + RLENGTH);}}'temp awk字符串函數,包括用法示例:
|
溫馨提示:喜歡本站的話,請收藏一下本站!