awk

概念

awk是一種優良的文本處理工具,linux及unix環境中現有的功能最強大的數據處理引擎之一,這種編程及數據操作語言的最大功能取決於一個人所擁有的知識
awk是三個人名的縮寫

awk語言是由模式和動作組成

模式
正則表達式
關係表達式
匹配表達式

動作
變量
命令
內置函數
流控制語句
BEGIN語句 :  設置計數和打印頭部信息,在任何動作之前執行
END語句 :  輸出統計結果,在完成動作之後執行

awk工作通過3個步驟

  1. 讀:從文件,管道,或者標準輸入中讀入一行然後把它放入內存中
  2. 執行:對每一行數據,根據AWK命令按照順序執行,默認情況是處理每一行數據,也可以指定模式
  3. 重複,:一直重複上述兩個過程直到文件結束

AWK支持兩種不同類型的變量:內置變量,自定義變量

$n	:	當前記錄的第n個字段,
$0	:	執行過程中當前行的文本內容
FILENAME	:	 當前輸入文件的名
FS 	:	字段分割符(默認是空格)
$NF :	最後一列
NF	:	每一行的字段數量 
FNR	:	各文件分別計數的行號
NR	:	表示記錄數,在執行過程中對應於當前的行號,
			NR和FNR的區別,
			NR在讀取不同文件時,是一直增加的
			FNR在讀取下一個文件時,從1開始計算
			
OFS	:	輸出字段分隔符(默認值是一個空格)
ORS	:	輸出記錄分隔符(默認值是一個換行符)
RS	:	記錄分隔符(默認是一個換行符)
\t	:	製表符
\n	:	換行符
~	:	匹配
!~	:	不匹配

-F指定輸入分隔符,fs可以是字符串或者正則,分隔符默認是空格

[root@localhost ~]# echo aa/bb/cc/dd | awk -F "/" '{print $2}'
bb

將passwd中的用戶名打印出來

[root@localhost ~]# awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

或者

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

過濾出系統的ip地址

[root@localhost ~]# ifconfig ens33 | grep netmask | awk '{print $2}'
192.168.43.162

參與運算

[root@localhost ~]# echo "12 12 14 1" > a.txt
[root@localhost ~]# awk '{print $1+10}' a.txt 
22

[root@localhost ~]# echo "one two three four" | awk '{print $NF}'
four
[root@localhost ~]# echo "one two three four" | awk '{print $(NF-1)}'
three
[root@localhost ~]# echo "one two three four" | awk '{print $(NF/2)}'
two

打印出passwd文件中用戶uid小於10的用戶名和他登錄使用的shell
格式化輸出 \t:tab鍵製表符

[root@localhost ~]# awk -F ":" '$3<10{print $1,"\t<===>\t",$NF}' /etc/passwd
root 	<===>	 /sbin/nologin
bin 	<===>	 /sbin/nologin
daemon 	<===>	 /sbin/nologin
adm 	<===>	 /sbin/nologin

打印出passwd中uid小於10且shell是bin/bash的用戶

[root@localhost ~]# awk -F ":" '$3<10&&$NF="bin/bash"{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

開始和結束模塊

可以將上面的內容寫入到腳本文件
[root@localhost ~]# cat test1.awk 
BEGIN{
  print "UserId\t\t\tShell"
  print "=================="
  FS=":"
}
$3<10 && $ NF="/sbin/nologin"{
  printf "%-20s %-20s\n",$1,$NF
}

執行
[root@localhost ~]# awk -f test1.awk /etc/passwd
UserId			Shell
==================
root                 /sbin/nologin       
bin                  /sbin/nologin       
daemon               /sbin/nologin       
adm                  /sbin/nologin       
lp                   /sbin/nologin       
sync                 /sbin/nologin       
shutdown             /sbin/nologin       
halt                 /sbin/nologin       
mail                 /sbin/nologin       
sss                  /sbin/nologin     

打印以root開頭的行

[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin

以bash結尾的行

[root@localhost ~]# awk '/bash$/' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash

輸出行號大於等於3且小於等於6的行

[root@localhost ~]# awk -F: '(NR>=3&&NR<=6){print $0}' /etc/passwd
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

取出ip地址,(使用NR行號來定位)

[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.43.162

去除首行內容

[root@localhost ~]# ll
總用量 1716
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | grep -v ^總
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | sed 1d
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | awk 'NR!=1{print $0}'
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

使用awk找到包含root字符的行

[root@localhost ~]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

[root@localhost ~]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

[root@localhost ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

不匹配root行

[root@localhost ~]# awk '!/root/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
....

如果UID大於10,則輸出user=>用戶名, 否則輸出pass=>用戶名

[root@localhost ~]# awk -F: '{if($3>10){print "user=>"$1}else{print "pass=>"$1}}' /etc/passwd
pass=>root
pass=>bin
pass=>daemon
pass=>adm
pass=>lp
pass=>sync
pass=>shutdown
pass=>halt
pass=>mail
user=>operator
user=>games
user=>ftp
user=>nobody
user=>systemd-network

查出行號大於10,並且包含bin/bash的行

[root@localhost ~]# awk 'NR>10 && $NF ~ "bin/bash"{print $0}' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash

引用變量時,使用單引號+雙引號括起來的方式

[root@localhost ~]# awk 'BEGIN{print "'$USER'"}'
root

格式化輸出內容

printf
不會自動打印換行符\n
%c顯示字符的AscII碼
%d十進制整數
%f顯示浮點數
%s顯示字符串
%% % 本身
%u 無符號整數

輸出passwd文件的用戶名列內容

[root@localhost ~]# awk -F":" '{printf "%s\n",$1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

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