歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> 學習Linux

awk使用說明,awk3121說明書

awk使用說明,awk3121說明書

awk使用說明,awk3121說明書


原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html

Awk使用說明

 

運維必須掌握的三劍客工具:grep(文件內容過濾器),sed(數據流處理器),awk(報表生成器),該文檔大致講述一下awk語法和在日常運維工作中使用awk帶來的好處和效率。再感歎一下awk實在是太強大了,完全是一門編程語言!(網上awk資料很多,自己整理Mark一下)

 

提示:Linux使用的gawk

官方解釋:gawk - pattern scanning and processing language

[root@test ~]# ll /bin/awk

lrwxrwxrwx. 1 root root 4 Mar 16  2016 /bin/awk -> gawk

 

語法格式

  awk [ POSIX or GNU style options ] 'program-file/script' file ...

  awk [ POSIX or GNU style options ] 'program-text/PATTERN {action}' file ...

 

下面一一講解各個參數的含義和用法

 

一:Options

參數選項,個人理解為打印報表輸出指定哪種屬性,一般用的最多的就是-F、-v兩個參數

-F/--field-separator:Use fs for the input field separator.(分隔符文本切割字符串)

該參數支持各種表達式,包括正則表達式 如:-F "^m"

舉例:ifconfig eth0 | awk -F "addr:| Bcast:" 'NR==2{print $2}'

-v:Assign the value val to the variable var, before execution of the program begins.

  Action內部可以引用腳本外的變量

舉例:awk -v var="verrion" 'BEGIN{print var}'

 

二:行為模式

'program-text/PATTERN {action}':必須用單引號引用,中間的模式和action完全是一門編程語言,語法和其他編程或腳本語言類型,具有變量、邏輯語句等。

 

1、PATTERN模式

'program-text/pattern {action}'

模式類型

解釋說明

舉例

empty

空模式:匹配任意輸入行

awk -F: '{print $1}' /etc/passwd

RE

正在表達式:格式為/regular expression/

awk -F: '/^m/{print $1}' /etc/passwd

BEGIN/END

僅在awk命令執行時運行一次或者結束前運行一次

awk -F: 'BEGIN{un="Username";id="Id";shell="Shell";printf "%-10s%-10s%-20s\n",un,id,shell}{printf "%-10s%-10s%-20s\n",$1,$3,$7'} /etc/passwd

Expression

表達式:其值非0或非空字符時滿足條件

awk -F: '$1=="verrion"{print $1}' /etc/passwd

Ranges

指定范圍匹配:格式為pat1,pat2

awk -F: '/^r/,/^m/{print $1}' /etc/passwd

 

2、常見的action

分類

解釋說明

action類型

Action支持各種類型,如下:

expression表達式

regular expression正則表達式

Pattern expression模式匹配表達式

control statements控制語句

compound statements復合語句

Input statements輸入語句

Output statements輸出語句

下面語法會一一講解

模式

指定一個行的范圍,該語法不能包括BEGIN/END模式

BEGIN

讓用戶指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裡設置全局變量

END

讓用戶在最後一條輸入記錄被讀取之後所發生的動作

 

3、語法如下

1)變量

要點

類型

說明

內置變量

記錄變量

FS:field separator,讀取文本時所使用的列分隔符

RS:Record separator,輸入文本信息所使用的行分隔符

OFS:Output field separator

ORS:Output record separator

如:awk -F:  OFS="#"   FS="#"

數值變量

NR:The number of input records;awk命令所處理的記錄數,如果有多個文件,這個數目會把處理的多個文件中讀取的行統一計數;

NF:number of field;當前記錄的field(列)個數;

FNR:與NR不同的是,FNR用於記錄的行數是當前文件的總讀取的行數;

ARGV:數組,保存命令行整個字符串,如awk '{print $0} test1.txt test2.txt'這個命令中,ARGV[0]保存awk,ARGV[1]保存test1.txt;

ARGC:awk命令參數的個數;

FILENAME:awk處理的文件名;

外來變量

自定義變量

用戶自定義自己的變量以便在程序或者腳本中使用,變量名命令規則和其他程序語言相同,只能以字母

數字和下劃線開頭,gawk變量名稱區分字符大小寫

在腳本中賦值變量

給變量賦值使用賦值語句進行,比如:

awk 'BEGIN{var="verrion";print var}'

在命令行中賦值變量

在腳本外為變量賦值,並在腳本中進行引用,比如:

awk -v var="verrion" 'BEGIN{print var}'

 

2)數組

要點

說明

解釋

表達式

array[index-expression]

可使用任意字符串,需要注意的是:如果某數組元素不存在,則自動創建此元素並初始化為空串;

下標值

不同之處

重點:不同於其他語言的數組,其下表值不止於數字,可以是字符串,同時每個下標值可以做累積

遍歷元素

For循環

for(var in array){statement,...}

其中var用於引用數組的下標,而不是元素

判斷元素

index in array

要判斷某數組中是否存在某元素,需要使用index in array方式

刪除數組

delete array[index]

從關系數組中刪除數組索引需要用delete命令

典型案例

語法for(i in array){statement1;statement2;....}

1.awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){print "%15s;%i\n",A,BASH[A]}}' /etc/passwd

2.netstat -ant | awk '/^tcp/{++S[$NF]} END{for(a in S) print a,S[a]}'

 

3)操作符

類型

要點

說明

算法

數值運算

-x:負值   +x:轉換為數值   x^y或x**y:次方

x*y:乘法  x/y:除法  x+y:加法  x-y:減法 x%y:求余

字符串

字符串連接

只有一個,而且不用寫出來,用於字符串連接

比如:awk 'BEGIN{a="a";b="b";c=(a""b);print c}'

賦值

類似於算法操作

=:變量賦值 +=  -=  *=  /=  %=  ^=  **=

++:自增

--:自減

需要注意的是:如果某模式為*號,此時使用/*/可能會有語法錯誤,應以/[*]/替代;

布爾值

True/false

任何非0值或非空字符串都為真,反之就為假;

比較

數值比較
字符串匹配

x<y  x<=y  x>y  x>=y  x==y  x!=y

x~y y是個模式,x能被匹配到

x!~y 不匹配模式

邏輯關系

並且或者

&&:前一個條件滿足才執行後一個條件

||:前一個條件不滿足才執行後一個條件

條件表達式

復合表達式

selector?if-true-exp:if-false-exp
selector為真,執行if-true-exp,否則執行if-false-exp

函數調用

函數調用

function_name(argv1,argv2)

 

4)控制語句

表達式

語法

舉例

if-else

if(condtion){then-body}else{[eles-body]}

awk -F: '{if ($1=="root") print $1,"Admin";else print $1,"Common User"}' /etc/passwd

 

while

while(condtion){statement;....}

awk -F: '{i=1;while(i<=3){print $i,i++}}' /etc/passwd

 

do-while

do{statement;....}while(condtion)

awk -F: '{i=1;do {print $i,i++}while(i<=3)}' /etc/passwd

 

for

for(variable assignment;condtion;iteration process){statement;....}

awk -F: '{for(i=1;i<=3;i++)print $i}' /etc/passwd

 

case

switch(expression){case VALUE or /REGEXP/;statement1,statement2,...,default;statementN,...}

BEGIN {foo = 1;switch (foo) {case 3:print "x";break;case 2:print "y" ;break;case 1:print "z" ;break;default:print "default" ;}}

break和continue

常用於循環和case語句

awk -F: '{for(i=1;i<=3;i++)if($i==root)break;print $i}' /etc/passwd

next

提前結束對本行文字的處理,並接著處理下一行

awk -F: '{if($3%2==0)next;print $1,$3}' /etc/passwd

 

 

5)打印輸出

打印類型

使用方法

注意事項

print

prinf使用格式print item,....

1:各item之間使用逗號分開,而輸出以空白輸出;

2:輸出的item可以為字符串或數值,如記錄的字段(如$1),變量或awk的表達式,數值會先轉換為字符串,然後再輸出;

3:print後面的item可以省略,則如print $0,因此,如果想輸出空白行,則需要使用print ""

printf

printf使用格式:

printf format, item....

1:與print最大不同在於printf需要指定format;

2:format用於指定後面的每個item輸出格式;

3:printf不會自動打印換行符:\n

format格式的指示符都以%開頭,如下:

%c:顯示字符的ASCII碼;

%d,%i:十進制整數;

%f:顯示浮點數;

%s:顯示字符串;

%u:無符號整數;

%%:顯示%本身;

修飾符:

N:顯示寬度;

-:左對齊;

+:顯示數字符號;

如:%-10s 表示左對齊輸出長度10個的字符串

 

6)函數

類型

常用函數

舉例

內置函數

數值函數rand():返回0-1之間的一個隨機數

awk 'BEGIN{print rand()}'

 

length([s]):返回指定字符串的長度

awk -F: '{print length($1)}' /etc/passwd

sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其第一次出現替換為s所表示的內容

 

  awk -F: '{print sub(o,O,$1)}' /etc/passwd

 

gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,並將其所有出現替換為s所表示的內容

ls -l /etc/hosts | awk -F "" '{gsub("r","4")};{gsub("w","2")};{gsub("x","1")};{gsub("-","0");print $2+$3+$4 $5+$6+$7 $8+$9+$10}'

split(s,a[,r]):以r為分隔符分割字符s,並將分割後的結果保存至a數組中,數組以下標為1開始的序列

netstat -ant | awk '/^tcp/{split($5,ip,":");count[ip[1]]++} END{for(i in count){print i,count[i]}}'

自定義函數

可以在引號中的任意地方定義,用{}表示塊整體,可以定義參數,但調用時可帶可不帶

用法如下:

awk '

  function max(a,b,c)

  {

  return a>b?a:b

  }

  {print max($1,$2)}' file

說明:顯示每行前兩個域的較大值,max為函數名,a、b為參數

http://xxxxxx/Linuxjc/1161510.html TechArticle

Copyright © Linux教程網 All Rights Reserved