1分鐘懂a(chǎn)wk-技不在深,夠用就行
1.什么是AWK (1)Aho、Weinberger、Kernighan三位發(fā)明者名字首字母; (2)一個(gè)行文本處理工具;
2.AWK基本原理 2.1原理:逐行處理文件中的數(shù)據(jù) 2.2語法: 說明: (1)單引號(hào)''是為了和shell命令區(qū)分開; (2)大括號(hào){}表示一個(gè)命令分組; (3)pattern是一個(gè)過濾器,表示命中pattern的行才進(jìn)行action處理; (4)action是處理動(dòng)作; (5)使用#作為注釋; 例子:顯示hello.txt中的第3行至第5行
| cat hello.txt | awk 'NR==3, NR==5{print;}' |
2.3pattern說明 pattern參數(shù)可以是egrep正則中的一個(gè),正則使用/pattern/ 例子:顯示hello.txt中,正則匹配hello的行
| cat hello.txt | awk '/hello/' |
說明: (1)pattern和action可以只有其一,但不能兩者都沒有; (2)默認(rèn)的action是print; 例子:顯示hello.txt中,長度大于100的行號(hào)
| cat hello.txt | awk 'length($0)>80{print NR}' |
3.內(nèi)置變量 FS 分隔符,默認(rèn)是空格 NR 當(dāng)前行數(shù),從1開始 NF 當(dāng)前記錄字段個(gè)數(shù) $0 當(dāng)前記錄 $1~$n 當(dāng)前記錄第n個(gè)字段 例子:顯示hello.txt中的第3行至第5行的第一列與最后一列
| cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}' |
4.內(nèi)置函數(shù) gsub(r,s):在$0中用s代替r index(s,t):返回s中t的第一個(gè)位置 length(s):s的長度 match(s,r):s是否匹配r split(s,a,fs):在fs上將s分成序列a substr(s,p):返回s從p開始的子串
5.操作符 5.1運(yùn)算符 類似于c,支持+、-、*、/、%、++、–、+=、-=等諸多操作; 5.2判斷符 類似于c,支持==、!=、>、=>、~(匹配于)等諸多判斷操作;
6.控制流程 6.1.BEGIN和END BEGIN和END本質(zhì)是一個(gè)pattern。 BEGIN用于awk程序開始開始前,做一些初始化的工作; END用于awk程序結(jié)束前,做一些收尾的工作。 例子:統(tǒng)計(jì)字符個(gè)數(shù)
| awk ' BEGIN { count=0; } { count+=length($0); } END { print count; }' |
6.2流程控制語句 (1)if(condition){}else{} (2)while{} (3)do{}while(condition); (4)for(init;condition;step){} (5)break/continue:如果有END,會(huì)執(zhí)行END中的收尾工作 個(gè)流程控制語句用法幾乎與c相同。
7.awk與shell的交互 (1)awk中使用shell中定義的變量:使用單引號(hào)即可;
| #!/bin/bash STR='hello' echo | awk '{ print ''${STR}''; }' |
(2)awk中使用shell命令:使用雙引號(hào),或者system命令;
| #!/bin/bash echo hello | awk '{ print $0 | 'cat' }' |
或者
| #!/bin/bash echo | awk '{ system('date > date.txt') }' |
(3)awk中的變量傳出至shell:沒有什么好方法,老老實(shí)實(shí)用文件吧; (4)getline:awk里,從文件中讀取變量到awk中
| #!/bin/bash echo | awk '{ while(getline < 'date.txt') { print $0; } }' |
8.結(jié)束語 對(duì)不起,樓主欺騙了你,認(rèn)真看完本文或許不止1分鐘。不過,如果你真的認(rèn)真閱讀并超過了1分鐘,相信你會(huì)有收獲。 ==【完】==
|