這樣理解AWK通俗易懂

原理

逐行處理文件中的數據

語法

awk 'pattern + {action}'

說明:
(1)單引號”是爲了和shell命令區分開;
(2)大括號{}表示一個命令分組;
(3)pattern是一個過濾器,表示命中pattern的行才進行action處理;
(4)action是處理動作;
(5)使用#作爲註釋;
例子:顯示hello.txt中的第3行至第5行

cat hello.txt | awk 'NR==3, NR==5{print;}'

pattern說明
pattern參數可以是egrep正則中的一個,正則使用/pattern/
例子:顯示hello.txt中,正則匹配hello的行

cat hello.txt | awk '/hello/'

說明:
(1)pattern和action可以只有其一,但不能兩者都沒有;
(2)默認的action是print;
例子:顯示hello.txt中,長度大於100的行號

cat hello.txt | awk 'length($0)>80{print NR}'

內置變量

FS 分隔符,默認是空格
NR 當前行數,從1開始
NF 當前記錄字段個數
$0 當前記錄
1 1~n 當前記錄第n個字段
例子:顯示hello.txt中的第3行至第5行的第一列與最後一列

cat hello.txt | awk 'NR==3, NR==5{print $1,$NF}'

內置函數

gsub(r,s):在$0中用s代替r
index(s,t):返回s中t的第一個位置
length(s):s的長度
match(s,r):s是否匹配r
split(s,a,fs):在fs上將s分成序列a
substr(s,p):返回s從p開始的子串

操作符

運算符
類似於c,支持+、-、*、/、%、++、–、+=、-=等諸多操作;

判斷符
類似於c,支持==、!=、>、=>、~(匹配於)等諸多判斷操作;

控制流程

BEGIN和END

BEGIN和END本質是一個pattern。
BEGIN用於awk程序開始開始前,做一些初始化的工作;
END用於awk程序結束前,做一些收尾的工作。
例子:統計字符個數

awk '
BEGIN
{
count=0;
}
{
count+=length($0);
}
END
{
print count;
}'

流程控制語句

(1)if(condition){}else{}
(2)while{}
(3)do{}while(condition);
(4)for(init;condition;step){}
(5)break/continue:如果有END,會執行END中的收尾工作
個流程控制語句用法幾乎與c相同。

awk與shell的交互

(1)awk中使用shell中定義的變量:使用單引號即可

#!/bin/bash
STR="hello"
echo | awk '{
print "'${STR}'";
}'

(2)awk中使用shell命令:使用雙引號,或者system命令

#!/bin/bash
echo hello | awk '{
print $0 | "cat"
}'

(3)awk中的變量傳出到shell

(4)getline:awk裏,從文件中讀取變量到awk中

#!/bin/bash
echo | awk '{
while(getline < "date.txt")
{
print $0;
}
}'
發佈了55 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章