天天看點

1分鐘懂awk-技不在深,夠用就行

1分鐘懂awk-技不在深,夠用就行

1.AWK

(1)Aho、Weinberger、Kernighan三位發明者名字首字母;

(2)一個行文本處理工具;

2.基本原理

2.1原理:逐行處理檔案中的資料

2.2文法:

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;}'           

2.3pattern說明

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}'           

3.内置變量

FS 分隔符,預設是空格

NR 目前行數,從1開始

NF 目前記錄字段個數

$0 目前記錄

$1~$n 目前記錄第n個字段

例子:顯示hello.txt中的第3行至第5行的第一列與最後一列

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

4.内置函數

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開始的子串           

5.操作符

5.1運算符

類似于c,支援+、-、*、/、%、++、–、+=、-=等諸多操作;

5.2判斷符

類似于c,支援==、!=、>、=>、~(比對于)等諸多判斷操作;

6.控制流程

6.1.BEGIN和END

BEGIN和END本質是一個pattern。

BEGIN用于awk程式開始開始前,做一些初始化的工作;

END用于awk程式結束前,做一些收尾的工作。

例子:統計字元個數

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,會執行END中的收尾工作

個流程控制語句用法幾乎與c相同。

7.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"
}'           

或者

#!/bin/bash
echo | awk '{
system("date > date.txt")
}'           

(3)awk中的變量傳出至shell:沒有什麼好方法,老老實實用檔案吧;

(4)getline:awk裡,從檔案中讀取變量到awk中

#!/bin/bash
echo | awk '{
while(getline < "date.txt")
{
print $0;
}
}'           

結束語:對不起,樓主欺騙了你,認真看完本文或許不止1分鐘。不過,如果你真的認真閱讀并超過了1分鐘,相信你會有收獲。