awk簡單用法
阿新 • • 發佈:2020-12-17
文章目錄
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}'
~:判斷指定的內容是否滿足正則表示式
滿足則為真
不滿足則為假
!~:判斷指定的內容是否不滿足正則表示式
不滿足則為真
滿足則為假