1. 程式人生 > >Linux awk命令詳解

Linux awk命令詳解

awk命令作用:

文字處理
輸出格式化的文字報表
執行算數運算
執行字串操作
執行系統命令
等等

AWK的程式結構:

BEGIN 語句塊

BEGIN語句塊的語法

BEGIN {awk-commands}
BEGIN語句塊在程式開始的使用執行,它只執行一次,在這裡可以初始化變數。BEGIN是AWK的關鍵字,因此它必須為大寫,注意,這個語句塊是可選的。

BODY 語句塊

BODY語句塊的語法

/pattern/ {awk-commands}
BODY語句塊中的命令會對輸入的每一行執行,我們也可以通過提供模式來控制這種行為。注意,BODY語句塊沒有關鍵字。

END 語句塊

END
語句塊的語法 END {awk-commands} END語句塊在程式的最後執行,END是AWK的關鍵字,因此必須為大寫,它也是可選的。 讓我們建立一個包含序號,學生姓名,科目名稱和得分的檔案 marks.txt。 1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89 下面的例子中我們將會顯示檔案內容,並且新增每一列的標題 $ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}'
marks.txt 上述程式碼執行後,輸出以下內容 Sr No Name Sub Marks 1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89 在程式的開始,AWK在BEGIN語句中打印出標題。然後再BODY語句中,它會讀取檔案的每一行然後執行AWK的print命令將每一行的內容列印到標準輸出。這個過程會一直重複直到檔案的結尾。

awk命令基本格式:

awk [options] file ...

awk呼叫方式:

1.命令列方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。
在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,預設的域分隔符是空格。

2.shell指令碼方式
將所有的awk命令插入一個檔案,並使awk程式可執行,然後awk命令直譯器作為指令碼的首行,一遍通過鍵入指令碼名稱來呼叫。
相當於shell指令碼首行的:#!/bin/sh
可以換成:#!/bin/awk

3.將所有的awk命令插入一個單獨檔案,然後呼叫:
awk -f awk-script-file input-file(s)
其中,-f選項載入awk-script-file中的awk指令碼,input-file(s)跟上面的是一樣的。

命令例項:

#輸出marks.txt的完整內容
$ awk '{print}' marks.txt 
$ awk '{print $0}' marks.txt

#輸出marks.txt每一行以空格為間隔的第一塊內容,(預設以空格為間隔)
$ awk '{print $1}' marks.txt
#輸出第二塊內容
$ awk '{print $2}' marks.txt
$ awk '{print $3 "\t" $4}' marks.txt

#輸出marks.txt檔案中字元數大於18的行
$ awk 'length($0) > 18' marks.txt
$ awk 'length($0) > 18 {print $0}' marks.txt

#輸出/etc/passwd檔案中每行以:間隔的第一個域
$ cat /etc/passwd |awk  -F ':'  '{print $1}'  

#輸出access_stat4.log檔案中含有content的行到gl.log檔案中 >> 表示追加,> 表示覆蓋
$ /bin/awk '/content/'  access_stat4.log >> ./gl/gl.log

$ /bin/awk '/content/ {print $1}'  access_stat4.log >> ./gl/gl.log

#輸出test.log檔案中含有content的行數
$ awk '/content/{++cnt} END {print "Count = ", cnt}' test.log
#輸出test.log檔案中含有content的行及其行數
$ awk '/content/{++cnt;print} END {print "Count = ", cnt}' test.log

#自定義間隔符,以+號為間隔符輸出test.log檔案每行的第一塊
$ awk -F "+" '{print $1}' test.log
#以+或8為間隔符
$ awk -F "+|8" '{print $1}' test.log

#正則  輸出test.log檔案中不含有如下字元的行  正則表示式操作符使用 ~ 和 !~ 分別代表匹配和不匹配。
$ awk '{if($0 !~ /Googlebot|Baiduspider|Sogou|bingbot|Yahoo/) print $0}' test.log
#輸出test.log檔案中以空格為間隔第一塊不含有如下字元的行
$ awk '{if($1 !~ /Googlebot|Baiduspider|Sogou|bingbot|Yahoo/) print $0}' test.log


#正則  輸出test.log檔案中含有 content/數字  的行
$ awk '{if($0 ~ /content\/[0-9]+/) print $0}' test.log

#排序  對nginx_access.log檔案中第一塊出現行數數量進行排序
$ awk '{print $1}' nginx_access.log |sort |uniq -c|sort -n #升序
$ awk '{print $1}' nginx_access.log |sort |uniq -c|sort -nr #降序

#統計某個資料夾下的所有檔案佔用的位元組數
$ ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
#統計某個資料夾下的每個檔案佔用的位元組數
$ ls -l |awk '{size=0;} {size=size+$5;} {print "[end]size is ", size}'


#條件語句
$ ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 

#迴圈與陣列
$ awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

awk內建變數:

awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。

ARGC               命令列引數個數
ARGV               命令列引數排列
ENVIRON            支援佇列中系統環境變數的使用
FILENAME           awk瀏覽的檔名
FNR                瀏覽檔案的記錄數
FS                 設定輸入域分隔符,等價於命令列 -F選項
NF                 瀏覽記錄的域的個數
NR                 已讀的記錄數
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符
#此外,$0變數是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。

#統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:

$ awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

輸出:

filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
#使用printf替代print,可以讓程式碼更加簡潔,易讀

$ awk  -F ':'  '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

while迴圈:

$ awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i; i++; } print total; }'  

for迴圈:

$ awk 'BEGIN{  total=0;  for(i=0;i<=100;i++)  {  total+=i;  }  print total;  }'  

$ awk 'BEGIN{  for(k in ENVIRON)  {  print k"="ENVIRON[k];  }  }'  

do 迴圈:

$ awk 'BEGIN{ total=0; i=0; do {  total+=i; i++; }while(i<=100) print total; }'  

awk指令碼命令:

!/bin/awk -f   
# all comment lines must start with a hash '#'  
# name: student_tot.awk  
# to call: student_tot.awk grade.txt  
# prints total and average of club student points  
# print a header first  
BEGIN  
 {  
   print "Student    Date   Member No.  Grade  Age  Points  Max"  
   print "Name  Joined Gained  Point Available"  
   print"========================================================="  
 }  

# let's add the scores of points gained  
(tot+=$6);  

# finished processing now let's print the total and average point  
END  
{  
    print "Club student total points :" tot  
    print "Average Club Student points :" tot/N  
}
#輸出nginx日誌中每秒訪問數超過40的時間點
/bin/awk -F '[][]' '{print $2}' /var/log/access.log |sort |uniq -c|sort -n | /bin/awk '$1 >= 40{print $0}'

#nginx日誌訪問ip量排序
awk '{print $1}' nginx_access.log |sort |uniq -c|sort -n
條件表示式
==   !=   >   >=  
awk -F":" '$1=="mysql"{print $3}' /etc/passwd  
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd          //與上面相同 
awk -F":" '$1!="mysql"{print $3}' /etc/passwd                 //不等於
awk -F":" '$3>1000{print $3}' /etc/passwd                      //大於
awk -F":" '$3>=100{print $3}' /etc/passwd                     //大於等於
awk -F":" '$3<1{print $3}' /etc/passwd                            //小於
awk -F":" '$3<=1{print $3}' /etc/passwd                         //小於等於
#多分隔符
awk -F'[:#]' '{print NF}'  helloworld.sh           #指定多個分隔符: #,輸出每行多少欄位
awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6}' OFS='\t' helloworld.sh #製表符分隔輸出多欄位

awk -F'[:#/]' '{print NF}' helloworld.sh         #指定三個分隔符,並輸出每行欄位數
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9}' helloworld.sh #製表符分隔輸出多欄位

awk -F ‘[][]’ ‘{print $3;}’ data   #以[和]為分隔符

每行都是數字的檔案中,求平均值

gzcat  default.log.gz | awk -F 'speed=|H/s&ssas' '{print $2}' | awk 'BEGIN{sum=0}{sum+=$1}END{print sum/FNR}' 

相關推薦

【轉】linux awk命令

column 環境變量 最後一行 工作流程 初始 文本文件 for循環 其中 cti 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切

[轉載]linux awk命令

基本 特定 收集 comm rip 解釋 文本 工作流程 復制代碼 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各

linux awk命令

列數 才會 遍歷數組 文本文件 信息 shell腳本 == game 入門 簡介 awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分

[轉]linux awk命令

分享 相同 list 等於 connected lis gin 顯示 大於等於 awk是行處理器: 相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息 awk處理過程: 依次對每一行進行處理,然後輸出 awk命令形式:

linux awk命令(一) awk語法 awk運算 awk陣列

如何把一行豎排的資料轉換成橫排? awk '{printf("%s,",$1)}' filename awk中使用NR和FNR的一些例子 http://blog.sina.com.cn/s/blog_5a3640220100b7c8.html http://www.linuxidc.com/Linux

linux awk 命令

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和ga

Linux awk命令

awk命令作用: 文字處理 輸出格式化的文字報表 執行算數運算 執行字串操作 執行系統命令 等等 AWK的程式結構: BEGIN 語句塊 BEGIN語句塊的語法 BEGIN {awk-commands} BEGIN語句塊在程式開始的使用執行,它

linux awk命令【轉】

awk是行處理器: 相比較螢幕處理的優點,在處理龐大檔案時不會出現記憶體溢位或是處理緩慢的問題,通常用來格式化文字資訊awk處理過程: 依次對每一行進行處理,然後輸出awk命令形式:awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file [-F|-

linux awk命令(轉載)

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gaw

linuxawk命令

數學函數 mat loop 多次 finished 數組結構 save pre 新的 awk是一種程序語言,對文檔資料的處理具有很強的功能。awk名稱是由它三個最初設計者的姓氏的第一個字母而命名的: Alfred V. Aho、Peter J. We i n b e rg

Linux三劍客值awk命令

數據處理 程序 package mysq regular 邏輯與 body 相同 導致 一、awk介紹 AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得自於它的創始人 Alfred A

Linux Shell指令碼程式設計 --awk命令

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。    

Linux三劍客之awk命令

awk簡單入門 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 使用方法: awk '{pattern + a

Linuxawk 命令 01

文章目錄 一、awk 介紹 二、語法格式 三、基本用法 1、每行按空格或TAB分割,並輸出文字中的第1、4項 2、格式化輸出 3、awk -F 指定分割字元 3.1 使用 ` , `分割 3.

Linux Shell指令碼程式設計--awk命令

簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。 詳細介紹: AWK命令介紹 awk語言的最基本功能是在檔案或字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他

Linuxawk命令

http://zhangge.net/1939.html 簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。

linuxawk命令

簡介awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本: awk、nawk和gawk,未作特別

Linuxawk命令

grep 或 egrep 或awk 過濾兩個或多個關鍵詞:  grep -E ‘123|abc’ filename // 找出檔案(filename)中包含123或者包含abc的行  egrep ‘123|abc’ filename //用egrep同樣可以實現  awk

linux文字處理三劍客(三):awk命令

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gaw

linux指令碼 awk命令

轉載自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk