1. 程式人生 > 其它 >awk簡單用法

awk簡單用法

技術標籤:Linux基礎命令linux

文章目錄


awk/gawk 其實就是一種程式語言,作用是對檔案中的內容進行掃描和處理

命令格式

awk [options] ‘pattern{action}’ fineName

工作原理

awk在處理檔案的時候,是逐行讀取檔案的內容

當讀取一行以後,會檢查是否滿足指定的條件,如果滿條件,則執行響應的動作,如果不滿足條件,則繼續讀取下一行內

容,然後再次判斷是否滿足條件, 當一個檔案中的全部的行都被讀取完畢之後,就會自動的退出awk

概念

  • 記錄(Record):預設檔案中的一行就是一個記錄(可以修改)

  • 欄位分隔符(FS Field Separator):用來將一個記錄分割成若個欄位的那個符號或者字元

  • 記錄分隔符(RS Record Separator):將一個檔案中的全部的內容分給成一個一個記錄的那個符號【預設情況下,換行

    符就是記錄分隔符】

  • 欄位(Field):記錄被分隔符分隔之後的各個區域就是一個一個的欄位

  • 記錄編號(NR Number of Record):awk從檔案每讀取一行內容,NR都會加

    欄位的表示方式:

    • $1 $2 …
    • $0:表示一整條記錄
    • $NF:表示一條記錄的最後一個欄位
    • $(NF-1):表示倒數第二列
內建變數
NF   欄位個數,(讀取的列數)

NR   記錄數(行號),從1開始,新的檔案延續上面的計數,新檔案不從1開始

FNR  讀取檔案的記錄數(行號),從1開始,新的檔案重新從1開始計數

FS   輸入欄位分隔符,預設是空格

OFS  輸出欄位分隔符 預設也是空格

RS   輸入行分隔符,預設為換行符

ORS  輸出行分隔符,預設為換行符

舉例

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

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

或
 awk  -F ':'  '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$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

awk的一些用法

獲取某些列的某些行(列印或不列印第幾行)

NR==n 表示列印第n行

NR!=n 表示不列印第n行

1)取test.txt檔案中的第1,2列,不列印第一行
[[email protected] app_zhibiao.sh]# cat test.txt
wang 11 aa
shi  22 bb
kevin 33 cc
grace 44 dd
hui 55 ee

[[email protected] app_zhibiao.sh]# awk 'NR!=1 {print $1,$2}' test.txt
shi 22
kevin 33
grace 44
hui 55
 
2)取test.txt檔案中的第3列的第2行
[[email protected] app_zhibiao.sh]# awk 'NR==2 {print $3}' test.txt 
bb
統計網站url
#cat /tmp/url.txt
http://www.baidu.com/index.html
http://mail.baidu.com/a.html
http://mail.baidu.com/index.php
http://www.baidu.com/index.asp
http://www.baidu.com/index.jsp
http://ftp.baidu.com/index.cc
http://www.baidu.com/index.html
http://mail.baidu.com/index.htmlx
http://www.baidu.com/index.xml
http://www.baidu.com/index.php
http://mail.baidu.com/index.html
http://www.baidu.com/index.jsp
http://ftp.baidu.com/index.html
http://www.baidu.com/index.asp
http://mail.baidu.com/index.html
http://mail.baidu.com/index.html
http://www.baidu.com/index.html


awk -F "/+" '{url[$2]++}END{for(i in url){print url[i],i}}' /tmp/url.txt

正則表法式補充

1. ^以指定字元為開頭

2. $以指定字元為結尾

	例子:將以字母i為開頭的行的第二個欄位輸出(要求分隔符為空格)
		# awk -F " " '/^i/{print $2}' test.txt 
		
	例子:將以字串conf為結尾的行的第三個欄位輸出(要求分隔符為/)
		# awk -F "/" '/conf$/{print $3}' test.txt
		
3. .表示任意單個字元

	例子:將包含字串le的行的第二個欄位輸出(要求分隔符為空格)
		# awk -F " " '/le/{print $2}' test.txt
		
	例子:將包含字串lxxxl的行第二個欄位輸出(要求分隔符為空格)
		# awk -F " " '/l...l/{print $2}' test.txt 
		
4. *表示其前面的字元出現任意次數的情況

	例子:將包含字串WI後面有N多個L的行的第二個欄位打印出來(要求分隔符為空格)
		# awk -F " " '/WIL*/{print $2}'
		
	補充:
		WIL*
		W(IL)*
		
5. +表示其前面的字元出現至少一次的情況
	/ro+t/
		rot
		root
		roooot
		roooooot
		
6. ?表示其前面的字元出現最多一次的情況
	/ro?t/
		rt
		rot
		
7. []匹配範圍以內的單個字元

8. [^]匹配範圍意外的任意單個字元

 例子:將不是以字母S A 或者 # 開的行的第二個欄位打印出來(要求分隔符為空格)
 # awk -F " " '/^[^SA#]/{print $2}' new.txt
 
9. ()分組

10. |表示或

	例子:將包含字母W或者單詞 by的行的第二個欄位打印出來(要求分隔符為空格)
		# awk -F " " '/W|(by)/{print $2}' new.txt
		
			區分:
			W|wc    Wc 或者 wc
			W|(wc)  W  或者 wc
			
11. {m,n} 表其前面的字元出現至少m次,最多n次的情況
	{m}   表示其前面的字元出現m次的情況
	{m,}
	{,n}
	
注意:
	可以對一整行進行內容匹配篩選,也可以對一個欄位進行	
	如果是對欄位進行匹配,需要使用~
	
	例子:將檔案以空格為分隔符,輸出第三個欄位
		# awk -F " " '{print $3}' test.txt 
		
	例子:將檔案以空格為分隔符,將第一個欄位中以字母i為開頭的行的第三個欄位輸出
		# awk -F " " '$1~/^i/{print $3}'
		
	例子:將檔案以空格為分隔符,將第一個欄位中不是以字母i為開頭的行的第三個欄位輸出
		# awk -F " " '$1!~/^i/{print $3}'


    ~:判斷指定的內容是否滿足正則表示式
    滿足則為真
    不滿足則為假

    !~:判斷指定的內容是否不滿足正則表示式
    不滿足則為真
    滿足則為假

部落格參考

大神部落格1

大神部落格2