awk命令在處理文字中很方便,最近總結了一些awk的具體應用。
1、awk引數介紹
先寫乙個常用命令:
cat 4653_trans_out |awk -f','
''
-f',' 是文字中的每一行按逗號分割
$0 是文字中的每一行
$1 是文字中每一行切割後的第乙個字段
awk內建變數介紹:
記錄變數:
fs: field separator,讀取文字時所使用的字段分隔符
rs: record separator,讀取文字資訊所使用的換行符
ofs: output filed separator: 輸出文字時使用的字段分隔符
ors:output row separator:輸出文字時使用的行分隔符
資料變數:
nr: the number of input records,awk命令所處理的記錄數;如果有多個檔案,這個數目會把處 理的多個檔案中行統一計數;
nf:number of field,當前記錄的field個數;
fnr: 與nr不同的是,fnr用於記錄正處理的行是當前這一檔案中被總共處理的行數;
argv: 陣列,儲存命令列本身這個字串,如awk '' a.txt b.txt這個命令中,argv[0]儲存awk,argv[1]儲存a.txt;
argc: awk命令的引數的個數;
filename: awk命令所處理的檔案的名稱;
environ:當前shell環境變數及其值的關聯陣列;
awk自定義變數:
awk允許使用者自定義自己的變數以便在程式**中使用,變數名命名規則與大多數程式語言相同,只能使用字母、數字和下劃線,且不能以數字開頭
例項:awk 'begin'
awk -v var="variable testing" 'begin'
2、awk中的程式設計語句
(1、awk中if的應用
例項命令如下:
cat 4653_trans_out |awk -f','
'}'
例項的命令是如果檔案中每一行第5個字段的後四位如果是0446 就輸出這一行
(2、awk中while的應用
例項命令如下:
awk -f: '; i++}}' /etc/passwd
awk -f: '' /etc/passwd
(4、awk中使用陣列
例項如下:
array[index-expression]
index-expression可以使用任意字串;需要注意的是,如果某資料組元素事先不存在,那麼在引用其時,awk會自動建立此元素並初始化為空串;因此,要判斷某資料組中是否存在某元素,需要使用index in array的方式。要遍歷陣列中的每乙個元素,需要使用如下的特殊結構:
for (var in array)
顯示各個shell的個數和
awk -f: 'end}' /etc/passwd
刪除陣列變數:
從關係陣列中刪除陣列索引需要使用delete命令。使用格式為
delete array[index]
(5、awk中內建函式:
split(string, array [, fieldsep [, seps ] ])
功能:將string表示的字串以fieldsep為分隔符進行分隔,並將分隔後的結果儲存至array為名的陣列中;陣列下標為從0開始的序列;
netstat -ant | awk 『/:80>/end}』 | sort -rn | head -50
length([string])
功能:返回string字串中字元的個數;
substr(string, start [, length])
功能:取string字串中的子串,從start開始,取length個;start從1開始計數;
system(command)
功能:執行系統command並將結果返回至awk命令
systime()
功能:取系統當前時間
tolower(s)
功能:將s中的所有字母轉為小寫
toupper(s)
功能:將s中的所有字母轉為大寫
(6、awk自定義函式
awk的函式可以在引號中的任意地方定義,用{}括起即可,可以定義引數,但呼叫時可帶可不帶:
如:顯示每行前兩個域的較大值的函式如下:
1. awk '
2. function max(a,b,c)
3.
6. ' file
說明:顯示每行前兩個域的較大值,max為函式名,a、b為引數,(類似於c語言的形參)
3、awk的模式
awk 'program' input-file1 input-file2
其中的program為:
pattern
pattern
常見的模式型別:
(1、regexp: 正規表示式,格式為/regular expression/
例如:顯示以r開頭的行
awk -f: '/^r/' /etc/passwd
(2、expresssion:表示式,其值非0或為非空字元時滿足條件,如:$1 ~ /foo/ 或 $1 == "magedu",用運算子~(匹配)和~!(不匹配)。
例題:顯示id號小於等於5的使用者和id號
awk -f: '$3-1<5' /etc/passwd
awk -f: '$3
<=5' /etc/passwd
取出預設shell為bash的使用者
awk -f: '$7~"bash$"' /etc/passwd
顯示預設shell不是bash的使用者
awk -f: '$7!~"bash"' /etc/passwd
(3、ranges: 指定的匹配範圍,格式為pat1,pat2
顯示id號為0或者shell為/sbin/nologin的使用者
awk -f: '$3==0,$7~"nologin"' /etc/passwd
(4、begin/end:特殊模式,僅在awk命令執行前執行一次或結束前執行一次
awk -f: '$3==0,$7~"nologin"' /etc/passwd
可以在顯示時顯示表頭
awk -f: 'begin' /etc/passwd
顯示表頭和表尾
awk -f: 'begin end
' /etc/passwd
(5、empty(空模式):匹配任意輸入行,對檔案中的每一行做匹配
awk -f: '' /etc/passwd
awk 更改原始檔內容
原始檔內容如下:
li 120 abc
wang 500 bcd
zhng 180 abc
給第一列為zhng的行的第二列加上200
awk -f'\t'
'$1 ~ /zhng/1' test.txt 1
<> test.txt
執行結果:
li 120 abc
wang 500 bcd
zhng 380 abc
awk 直接覆蓋原始檔內容
awk '' test.txt | tee test.txt
awk語法與文字應用處理
awk命令的一般形式 awk begin pattern1 pattern2 patternn end input filename 其中,begin 和 end 是可選的。awk的執行過程如下 1,如果存在begin,awk首先執行它指定的actions。2,awk從輸入中讀取一行,稱為一條輸入記...
awk處理多行文字的記錄
awk使用內建的變數rs將輸入流拆分為乙個個記錄 record 使用fs將乙個記錄拆分為若干個域 field rs的預設值為 n,fs的預設值為空白字元。有時候會出現乙個記錄跨越多行的情況,這時就需要手動設定rs為記錄中不會出現的字元 否則會將乙個記錄拆分為兩個記錄 如空行 rs 分頁符 rs f ...
shell中的awk應用
概念 awk是乙個資料處理工具!相較於sed是對一整行的處理 而awk則是比較傾向於 把一行分成多個欄位來處理 在linux 中常用的是gwak awk是gawk的鏈結檔案 awk語法格式 awk f begin 匹配規則 end filename 其中begin和end 是awk的關鍵字 因此必須...