awk的詳解 基本用法和高級用法


1 awk 用途  報告生成工具,主要在處理文本方面特別強大,也是一個獨立的程序語言,與grep sed 構成處理文本工具的三劍客。

同gawk 都是 GNU組織開發的開源工具

2 awk的工作原理,已每個記錄進行每個域的分離,如 常常是以每一行作為一個記錄,空白作為默認的與分隔符,然后以內置變量對每個域進行賦予變量!

 

3 語法結構

    awk option scrips file  

或這 echo “ ” | awk  option scripts 管道使用

 

option 選項主要有

-F  指定分隔符,而不以默認的空白(空格符或者制表符)

-v  指定變量

-f   指定腳本的文件名,即將腳本放入一個文件當中,避免awk書寫太長,影響視覺,和重復編寫

 

scripts 是對 處理的文本進行的操作

awk程序用一對花括號來定義,必須將腳本命令放到兩個花括號當中。花括號必須用單引號引起來

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

4 awk基本學會技能

  1、使用數據字段變量  $1 ,$2,....$n

  2、在腳本中使用多個命令 使用 ;

  3、從文件中讀取腳本程序 使用 -f

  4、在處理數據前運行的某些腳本內容  BEGIN

  5、在處理數據后運行的某些腳本內容  END

 

5 簡單用法事例講解

實例一: 初識awk

[root@shiyan ~]# echo "how are you" | awk '{print $1,"\t",$3}'

how    you

 

講解 awk 輸入流how are are 文本進行處理,首先 以空白進行分割字段域(filed) 然后用內置變量進行賦值

內置變量

$1 等於第一段域  實例中即 為how

$2 等於第二段域  實例中即 為 are

$3 等於第三段域  實例中即 為 you

如果還有段域 則依次類推 $4  ...$n

最后$0  等於整個記錄,即整行文本  how are you

 

此處沒有使用 option,使用默認的 空白 進行分割

scripts 為print $1,"\t",$3   打印第一個字段  和一個 制表符 和第三個字段

 

實例二:提取/data 分區的使用率

[root@shiyan ~]# df -h | grep "/data"

/dev/sda7        97G  1.2G   91G   2% /data

 

[root@shiyan ~]# df -h | grep "/data" | awk -F '[ \t%]+' '{print $5}'

2

解釋 一步完成了對/data 使用率的提取 使用率為2 ,-F 后面的指定分隔符時支持正則表達式的,此處為可以一空白 制表符 % 作為分隔符,且可以是N 個

上面也可以用如下進行,但顯得不夠專業,使用了兩次awk

[root@shiyan ~]# df -h | grep "/data" | awk '{print $5}' | awk -F '%' '{print $1}'

2

 

實例三 -f 的用法

[root@shiyan awk]# awk -F : '{test=" home directory is "; print $1,test, $6}' /etc/passwd

-f 的實現辦法

1 首先將 scripts 部分寫入一個文件當中

[root@shiyan awk]# cat awkfile 

{

test="home directory is"

print $1, test, $6

}

 

[root@shiyan awk]# awk -F : -f awkfile  /etc/passwd

root home directory is /root

bin home directory is /bin

 

實現的效果一樣,有時時非常有必要將處理腳本放入一個特定的文件中的,test="home directory is"  時test變量的賦值

 

實例四 -v選項的用法

[root@shiyan awk]# awk -F :  -v test="home directory is" '{ print $1, test, $6}' /etc/passwd

結果同上實例,-v 指定對test 變量賦值

 

 實例五: BEGIN在處理數據前運行某些腳本

如:

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd

解釋:BEGIN關鍵字會執行一次指定的腳本段,想要處理數據的腳本段在第二個程序中定義{ print $1,"\t\t", $7}

結果: 加上了 User ---------Sheel 的抬頭

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}' /etc/passwd

User -------------- Shell

root  /bin/bash

bin  /sbin/nologin

.....

 

實例六: END

[root@shiyan awk]# awk -F :  'BEGIN {print "User","--------------","Shell"}{ print $1,"\t\t", $7}END {print "The is last Line"}' /etc/passwd

結束 在所有操作完成之后,執行 END關鍵字定義的腳本段 END {print "The is last Line"}

 

注意: 兩段或者三段腳本命令 在awk上會被當成一個文本字符串,所以必須要加上一個 單引號

 

 

awk的高級用法即體現程序語言的用法請參考一下文章

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM