您好,登錄后才能下訂單哦!
這篇文章主要介紹了awk怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1. 首先簡要總結一些文本處理三劍客:
grep族:文本過濾工具
sed:行編輯工具
2. 下面就來看看awk是什么?
awk現在linux上用的是GNU awk即gawk ,現在centos系統上awk是gawk的一個符號鏈接文件。那么awk究竟在centos系統上是用來做什么的呢?awk就是一個報告生成器,格式化文本輸出的工具。
3. 學習awk對有什么幫助呢?
學習awk我們可以輕松的對我們想要處理的文本進行查看等,方便我們解決問題。
4. gawk的基本用法:
gawk - pattern scanning and processing language模式掃描及處理語言
語法: gawk [options ] ‘program’ file ...
詳說其中:
4.1 [options]:
-F指明輸入時的字段分隔符
-v VAR=VALUE 主要用于實現自定義變量
4.2 program:PATTERN{ACTION STATEMENTS}
語句之間用分號分隔
內建命令: print,printf
5. 選項中的使用的變量:
5.1 變量 (注:awk中自己的變量是不能加$符的,跟bash是不一樣的)
內建變量:
FS:input field seperator 輸入字段分隔符,默認為空白字符
此等同于-F分隔符
OFS:output field seperator 輸出字段分隔符,默認為空白字符
eg:
[root@bucktan ~]# tail -2 /etc/fstab| awk -v OFS=':' '{print $1,$3}'
sysfs:sysfs
proc:proc
[root@bucktan ~]# tail -2 /etc/fstab
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@bucktan ~]# tail -2 /etc/passwd| awk -v FS=':' '{print $1,$3}'
apple 2000
zabbix 495
RS:input record sepereator指定輸入時的換行符
ORS:output record sepereator指定輸出時的換行符
eg:
[root@bucktan ~]# awk -v RS=' ' -v ORS='##' '{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP##User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System##message##bus:/:/sbin/nologin
注意看其中的#號
NF:number of field 統計每一行字段的數量
{print NF}
{print $NF}:打印最后一個字段
~]# awk '{print NF}' /etc/passwd
eg:
[root@bucktan ~]# awk -F: '{print $NF}' /etc/passwd
NR:number of record打印每一行的行號,但事實上統計的是文件的總體行數
FNR:各文件分別計數,計行數
FILENAME:當前正在處理的文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
ARGV[0]:第一個參數
。。。。。
eg:
[root@bucktan ~]# awk 'BEGIN{print ARGV[0]}' /etc/passwd /etc/fstab
awk
[root@bucktan ~]# awk 'BEGIN{print ARGV[1]}' /etc/passwd /etc/fstab
/etc/passwd
注:BEGIN的作用是實現不會對每一行打印的結果。如果沒有BEGIN則每一行都要顯示一個打印的值
5.2自定義變量:
(1):-v var=value 變量名區分字符大小寫
(2):在program中直接定義
eg:
[root@bucktan ~]# awk -v abc='love you' '{print abc}’ /etc/passwd
另一種實現:
[root@bucktan ~]# awk 'BEGIN{abc="love you"; print abc} '
love you
語法: gawk [options ] ‘program’ file ...
program:PATTERN{ACTION STATEMENTS}
6. 其中的內建命令
6.1:print(用于{ACTION STATEMENTS}中)
print iterm1,iterm2,。。。
要點:(1):逗號為分隔符,但在輸出時顯示的是空白符而非逗號
(2) :輸出的各iterm可以是字符串、數值、當前記錄的字段、變量或awk的表達式
(3):如果省略iterm,相當于print$0
eg:
[root@bucktan ~]# tail -5 /etc/passwd | awk -F: '{print "hehe:"111$1,$3}'
hehe:111tcpdump 72
hehe:111bucktan 500
hehe:111centos 496
hehe:111apple 2000
hehe:111zabbix 495
[root@bucktan ~]# tail -2 /etc/passwd | awk -F: '{print}'
apple:x:2000:2000::/home/apple:/bin/bash
zabbix:x:495:492:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
6.2 printf命令
printf - format and print
格式化輸出:printf FORMAT iterm1,iterm2,...
要點: (1):FORMAT:必須要給出
(2):不會自動換行,需要顯示給出換行控制符才知道哪行
(3):FORMAT中需要分別為后面的每個iterm指定一個格式化符號
格式符:
%c:顯示字符的ASCII碼
%d,%i:顯示十進制整數
%e,%E:科學計數法數值顯示
%g,%G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%:顯示%自身
樣式一
[root@bucktan ~]# awk -F: '{printf "%s",$1}' /etc/passwd
rootbindaemonadmlpsyncshutdownhaltmailuucpoperatorgamesgopherftpnobodydbususbmuxdvcsarpcrtkitavahi-autoipdabrtrpcusernfsnobodyhaldaemongdmntpapache
樣式二
[root@bucktan ~]# awk -F: '{printf "%s\n",$1}' /etc/passwd
root
bin
daemon
adm
lp
樣式三
[root@bucktan ~]# awk -F: '{printf "username: %s\n",$1}' /etc/passwd
username: root
username: bin
username: daemon
username: adm
username: lp
樣式四
[root@bucktan ~]# awk -F: '{printf "username: %s, userid: %s\n",$1,$3}' /etc/passwd
username: root, userid: 0
username: bin, userid: 1
username: daemon, userid: 2
username: adm, userid: 3
username: lp, userid: 4
username: sync, userid: 5
username: shutdown, userid: 6
username: halt, userid: 7
username: mail, userid: 8
修飾符:
#[.#]:第一個數字控制顯示的寬度:第二個#表示小數點的精度
如%3.1f
-:左對齊 ,不加-為默認的右對齊
+:顯示數值的符號
[root@bucktan ~]# awk -F: '{printf "username: %-15s, userid: %s\n",$1,$3}' /etc/passwd
username: root , userid: 0
username: bin , userid: 1
username: daemon , userid: 2
##后面內容省略
7. 操作符
###(也是用在執行語句之中的,記得要用分號與print內建命令分開)
算術操作符:
x+y ,x-y,x*|/|^|%y
-x:負值
+x:轉換為數值
字符串操作符:沒有符號的操作符,字符串連接
賦值操作符:=,+=,-=,*=,/=,%=,++,--
比較操作符:>,<,>=,<=,!=,==
模式匹配符:
~:是否匹配
!~:是否不匹配
邏輯操作符:&&,||,!
函數調用:function_name() ,
若要傳遞參數使用:function_name(argu1,argu2,。。)
條件表達式:selector?if-true-expression:if-false-expression
selector為條件
if-true-expression:條件為真的表達式
if-false-expression:條件為假的表達式
eg:
[root@bucktan ~]# awk -F: '{$3>=1000?usertype="common user":usertype="sysuser or root";printf "%10s:%-s\n",$1,usertype}' /etc/passwd
root:sysuser or root
bin:sysuser or root
daemon:sysuser or root
adm:sysuser or root
lp:sysuser or root
sync:sysuser or root
語法: gawk [options ] ‘program’ file ...
program:PATTERN{ACTION STATEMENTS}
8. PATTERN
(1)empty:空模式,處理文本每一行
(2):/regular expression/:僅處理能夠被此模式匹配到的行
eg:
[root@bucktan ~]# awk '/^UUID\>/{print}' /etc/fstab
UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 /boot ext4 defaults 1 2
(3):relational expression:關系表達式,結果有“真”有”假“,結果為”真“才會被處理;
"真":表示結果為非0值,或者為非空字符串
eg:
[root@bucktan ~]# awk -F: '$3>=1000{print $3}' /etc/passwd
65534
2000
(4):line ranges 行范圍
startline,endline:/pat1/,/pat2
注:支持直接給出數字
eg:
[root@bucktan ~]# awk -F: '/^root\>/,/^adm\>/{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
(5):BEGIN/END
BEGIN{}:僅在開始處理文件中的文本之前執行一次
END{}:僅在文本處理完成之后執行一次
[root@bucktan ~]# awk -F: 'BEGIN{print "user id\n================"}{print $1,$3}END{print "end\n-----------"}' /etc/passwd
user id
================
root 0
bin 1
daemon 2
adm 3
[root@bucktan ~]# awk -F: 'BEGIN{print "user id\n================"}{printf "%10-s %10-s\n",$1,$3}END{print "end\n-----------"}' /etc/passwd
user id
================
root 0
bin 1
daemon 2
adm 3
語法: gawk [options ] ‘program’ file ...
program:PATTERN{ACTION STATEMENTS}
9.常用的action語句(即寫在{ACTION STATEMENTS}中的語句)
a:Expressions
b:cotrol statements:if ,while 等
c:compound statements:組合語句
d:input statements 輸入語句
e:output statements輸出語句
9.1 :控制語句
if(condition) {statements}
if(condition) {statements} else {statements}
while(condition) {statements
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
10.細說action語句
10.1 if -else
語法: if(condition) statements else [statements]
eg:
[root@bucktan ~]# awk -F: '{if($3>=1000) print $1,$3}' /etc/passwd
nfsnobody 65534
apple 2000
[root@bucktan ~]# awk -F: '{if($3>=1000) {printf "common user: %s\n",$1} else { printf "root or sysuser:%s\n",$1}}' /etc/passwd
root or sysuser:root
root or sysuser:bin
root or sysuser:daemon
root or sysuser:adm
root or sysuser:lp
root or sysuser:sync
10.2 while 循環
語法:while(condition) {statements}
條件為真進入循環為假退出循環
使用場景:對一行內的多個字段逐一進行處理時使用;對數組中各元素逐一處理時使用
eg:對/etc/fstab文件中以UUID開頭的行的每一個字段進行計算有多少個字符,并打印該字符段和字符數
[root@bucktan ~]# awk '/^UUID/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/fstab
UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 41
/boot 5
ext4 4
defaults 8
1 1
2 1
10.3 do-while (先運行一次循環體,在判斷條件)
語法:do {statements} while(condition)
意義:可以至少執行一次循環體
10.4 for循環
語法:for(expr1;expr2;expr3) {statements}
eg:
[root@bucktan ~]# awk '/^UUID/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/fstab
UUID=375e2006-28ec-4d8b-bc90-399b7c0f42f3 41
/boot 5
ext4 4
defaults 8
1 1
2 1
特殊用法:
能夠遍歷數組中的元素
語法:for (var in array) {for-body}
10.5 switch語句
語法:switch(expression) {case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP/:statement;....;default:statement}
注:其中之一分支匹配到,則執行此分支不執行其他分支了
10.6 break和continue
break [n]:退出n層循環
continue:退出當前循環
10.7 next 提前結束對本行的處理而直接進入下一行
eg:
[root@bucktan ~]# awk -F: '{if($3%2!=0) next ;print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
10.7 array
關聯數組:arry[index-expression]
index-expression:
(1):可使用任意字符,字符串要使用雙引號
(2):如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”
若要判斷數組中是否存在某元素,要使用“index in array”格式進行
11:函數
11.1:內置函數
數值處理:
rand()::返回0和1之間一個隨機數;
字符串處理:
length([s]):返回指定字符串的長度;
sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;
~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
感謝你能夠認真閱讀完這篇文章,希望小編分享的“awk怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。