一、linux的文本處理器三劍客
文本過濾器:grep、egrep、fgrep
行編輯器:sed(模式空間;保持空間)
報表生成器:awk(格式化文本輸出)gawk
awk的工作流程:
從文本中讀取一行內容,根據指定的分隔符;將讀入的一行內容分隔成字段,然后格式化輸出指定的字段
二、awk的命令相關的參數及用法
1、基本用法:
awk [options] 'program' file1,file2,..... options常用選項: -F[]:指定分隔符,使用[]可以指定多個分隔符 -v var=varl:變量賦值 program組成: PATTERN {ACTION STATEMENT},由語句組成,語句分隔符是";" ACTION:print,printf
例:使用awk對/etc/paswd文件進行編輯,賦值給變量test,利用-F指定分隔符":",使用print打印出指定內容
2、awk的常用輸出命令:print
用法:print item1,item2,….
注意要點:
①各item直接使用逗號分隔,而輸出時則使用輸出分隔符進行分隔
②輸出時各item可以是字符串或數值、當前記錄的字段($n)、變量或awk的表達式;數值會被隱式轉換字符輸出 ③print的item如果省略,相當于print $0,若輸出“空白”,則使用print "";
3、awk變量
內置變量: FS: input field separator;輸入分隔符,默認為空白字符 RS: input record separator;輸入換行符,默認為空白字符 OFS: output field separator;輸出分隔符,默認為空白字符 ORS: output record separator;輸出換行符,默認為空白字符 NF: 當前行的字段數 NR: 行數,所有文件統一計數 FNR: 行數,各文件分別計數 FILENAME: 當前文件名 ARGC: 命令行的參數的個數 ARGV: 數組,保存命令行的所有參數 自定義變量: -v VAR=VAL 定義變量的位置: 可以在program中定義 可以使用-v 定義
例1:利用FS,RS,OFS,ORS,對/etc/passwd進行文本處理
例2:統計當前行的字段數
例3:統計文件的行數:
例4:統計命令的個數和數組
例5:自定義變量
4、printf命令:
格式: printf format item1,item2,.... 注意要點: 1) format是必須的 2)不會自動換行,需顯示給定換行符 3)format中需要分別為后面的每個item指定一個格式符 格式符:都以%開始,后面跟一個字符 %c: 顯示字符的ASCII碼 %d,%i: 顯示十進制整數 %e,%E:以科學計數法顯示數值 %f:顯示浮點數 %g,%G:以科學計數法格式或浮點數格式顯示數值 %s:字符串 %u:無符號的整數 %%:顯示%自身 修飾符: #[.#]: 第一個#顯示字符寬度,例如%20s;第二個#表示小數點后的精度 -:左對齊 +:顯示數值符號 操作符: 算術運算操作符: x+y, x-y, x*y, x/y, x^y, x%y -x: 負值 +x: 轉換為數值 字符串操作符:字符串連接 賦值操作符: =, +=, -=, *=, %=, /=, ^=, ++, -- 比較操作符: <, >, <=, =>, ==, != 模式匹配符: ~ ,!~ 邏輯操作符: && || 條件表達式: selector? if-true-expression:if-false-expression 函數調用: function_name (argu1,argu2,...)
例1:格式符
例2:條件表達式
5、PATTERN:
1)/regular expression/:進出了能夠被/regluar expression/匹配到的行
2)relational expression:關系表達式,有真假之分,一般來說,其結果為非0或非空字符串時為"真",否則為"假"
3)line ranges: 行范圍,類似sed或vim的地址定界法:startline,endline
4)BEGIN/END:特殊模式,僅在awk運行程序之前執行一次BEGIN或僅在awk運行程序后執行一次END
5)empty:空模式,任意匹配
6、常用的action:
Expression Control statements Compound statements input statemenets output statements
7、控制語句:
1)if語句:對awk取得的整行或行中的字段做條件判斷 語法:if (condition) statement [else statement] if (condition) {statement; [else {statement};] 例: awk -F: '{if (($3)>=500) {print $1,"is command user"} else{print $1,"is admin user."}}' /etc/passwd
2)while循環:通常在當前行的字段間進行循環 語法:while (condition) statement while (condition) {statement} 例:# awk '{i=1;while(i<=NF){printf "%20s:%s\n",$i,length($i);i++}}' /etc/issue CentOS:6 release:7 6.6:3 Kernel:6 \r:2 on:2 an:2 \m:2
3)do-while循環:至少執行一次循環體 語法:do statement while (condition) do {do-while-body} while (condition)
4)for循環: 語法: for (expr1;expr2;expr3) statement for (expr1;expr2;expr3) {statement} 例:#awk '{for (i=1;i<=NF;i++) {printf "%s:%d\n",$2,length($i)}}' /etc/issue release:6 release:7 release:3 release:7 \r:6 \r:2 \r:2 \r:2 \r:2 for 循環在awk中有一個功能專用于遍歷數組元素 語法:for (var in arry) {for-body}
5)swithc:是gawk特有的,awk沒有此功能 語法:switch (expression) {case VALUE or /REGEXP/:statement;.......;default:statementN}
6)break and continue break[n]: 退出內存[n]循環 continue[n]: 提前結束本輪循環,直接進入下輪循環
7)netx:提前結束對本行的處理,而進入下一行的處理 例:# awk '{if (NF%2!=0) next; {print $0}}' /etc/issue CentOS release 6.6 (Final)
8)arry數組: 關聯數組:arry[index-expression],其中index-expression可以使用任意字符; 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,將其初時為空串 ;因此如果要判斷數組中是否存在某元素,要使用"index in arry" 進行 要遍歷數組中的每個元素,使用: for (var in arry) {for body} 注意:var會遍歷arry的每一個索引,print arry[var] 例:統計netstat中各狀態各出現多少次 # netstat -tan | awk '/^tcp/{state[$NF]++}END{for (i in state){print i,state[i]}}' ESTABLISHED 1 LISTEN 28
9)函數 (1)內置函數 數值處理: rand(): 返回0和1之間的一個隨機數 字符串處理: length([s]):返回指定字符串的長度 sub(r,s,[,t]):以r表示的模式來查找t字符串中的匹配,將其第一次出現替換為同s所表示字符串 gsub(r,s[,t]):以r表示的模式來查找t字符串中的匹配,將其所有出現替換為同s所表示字符串 split(s,a[,r]):以r為分隔符切割字符串s,并將切割的結果保存至a表示的數組中 substr(s,i,[,n]):從s表示的字符串中取字串,從i開始,去n個字符 時間函數: systime():取時間戳 # awk 'BEGIN{print systime()}' 1434125151 位運行函數: and(v1,v2) (2)自定義函數: funciton f_name(p,q) { ............... }
原創文章,作者:馬行空,如若轉載,請注明出處:http://www.www58058.com/5328