shell三劍客之一AWK的使用

AWK簡介:

AWK是一個強大的文本分析工具, 相對於其它兩個grep和sed的編輯,AWK對數據的分析和處理,凸顯其特性,AWK的命名 源於它的創始者,(Alfred Aho 、Peter Weinberger 和 Brain)


以下是AWK的三個版本

原始的AWK

新的NAWK

POSIX/GNU版本的GAWK


基本語法:

awk ‘{pattern action}’ {filenames}


儘管操作可能會複雜,但是語法是這樣的簡單,其中pattern表示AWK在數據中查找的內容,而action是在找到匹配內容時所執行的一系列命令。花括號‘{}’不需要始終出現,但它們用於根據特定的模式對一系列指令進分組。pattern也可以用正則表達式,使用的時候需要向sed一樣用“/ /”


awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息後,才能進行其他 文本操作。完整的awk腳本通常用來格式化文本文件中的信息。




使用AWK

1、模式AWK [ -F ]  'commands'  file

    F區域分隔符是可選的,默認的情況下是以空格和製表符分隔 commands是命            令,file是指定的文件:

例如:

[root@localhost python]# last -n 3

root     pts/0        192.168.126.1    Wed Jan  6 18:31   still logged in   
root     pts/0        
 :0                       Wed Jan  6 18:02 - 18:03  (00:00)    
root     :0          
  :0                       Wed Jan  6 18:02   still logged in

如果只顯示最近登錄的賬號:

[root@localhost python]# last -n 3 | awk '{print $1}'

root
root
root

shell腳本方式

將所有的AWK命令插入一個文件,並使用AWK程序可執行,然後AWK命令解釋器作爲腳本的首行,一遍通過鍵入腳本名稱來調用頭文件中用#!/bin/awk 代#!/bin/sh

 

例題:


1、如果只是顯示/etc/passwd的賬戶

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

root

daemon

bin

sys

這種是awk+action的示例,每行都會執行action{print $1}。

-F指定域分隔符爲':'。

 2、如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

#cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'

root    /bin/bash

daemon  /bin/sh

bin     /bin/sh

sys     /bin/sh



如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。

3、cat /etc/passwd |awk -F ':'  'BEGIN {print "name,shell"}{print $1 "," $7}{END {print "blue,/bin/nosh"}'

name,shellroot,/bin/bash

daemon,/bin/sh

bin,/bin/sh

sys,/bin/sh....

blue,/bin/nosh



搜索/etc/passwd有root關鍵字的所有行

4、#awk -F: '/root/' /etc/passwdroot:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,匹配了pattern(這裏是root)的行纔會執行action(沒有指定action,默認輸出每行的內容)。

搜索支持正則,例如

找root開頭的: awk -F: '/^root/' /etc/passwd

 

5、搜索/etc/passwd有root關鍵字的所有行,並顯示對應的shell

# awk -F: '/root/{print $7}' /etc/passwd           

 /bin/bash

 這裏指定了action{print $7}



 

awk內置變量

awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。

ARGC               命令行參數個數

ARGV               命令行參數排列

ENVIRON            支持隊列中系統環境變量的使用

FILENAME           awk瀏覽的文件名

FNR                瀏覽文件的記錄數

FS                 設置輸入域分隔符,等價於命令行 -F選項

NF                 瀏覽記錄的域的個數

NR                 已讀的記錄數

OFS                輸出域分隔符

ORS                輸出記錄分隔符

RS                 控制記錄分隔符




 

 

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

[root@localhost /]#cat /etc/passwd|awk -F':' '{print "filename:" FIENAME ",linenumber:" NR ",columns:" NF ",linecontent:" $0}'
filename:,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
filename:,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
filename:,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
filename:,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
filename:,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

……


使用printf替代print,可以讓代碼更加簡潔,易讀

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




awk編程


 變量和賦值

除了awk的內置變量,awk還可以自定義變量。

統計/etc/passwd用戶的人數:

awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd

root:x:0:0:root:/root:/bin/bash......

user count is  40

count是自定義變量。之前的action{}裏都是隻有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。

 

這裏沒有初始化count,雖然默認是0,但是妥當的做法還是初始化爲0:

awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd

[start]user count is  0root:x:0:0:root:/root:/bin/bash...

[end]user count is  40

 

統計某個文件夾下的文件佔用的字節數

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is  8657198

 

如果以M爲單位顯示:

ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is  8.25889 M

注意,統計不包括文件夾的子目錄。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章