awk工具(三劍客)

1、awk介紹

awk:(三劍客之一)

awk:是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk則更支持分段,默認會以空格爲分隔符將每行分段,對分段分析處理(匹配 查找 )

awk的版本:

awk:主要有三個版本:awk(GPL版本)  nawk(new 增強版)   gawk(GUN版本)

2、awk的基本用法:

2.1:打印指定內容(指定段):

[root@localhost awk]# awk -F ':' '{print $1}' test.txt      # -F參數用來指定文件分隔符,默認是以空格爲分隔符:
root
bin
daemon
adm

注意:默認以文件內容裏空格爲分隔符打印:

打印整個文本文檔:使用 "$0"  則打印整個文本:

[root@localhost awk]# awk '{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

也支持同時打印多個段落,支持手動指定分隔符:打印後的內容默認空格爲分隔符顯示

[root@localhost awk]# awk  -F ':' '{print $1,$2,$3}' test.txt     #默認則以空格爲分隔符:    
root x 0
bin x 1
daemon x 2

也支持對打印後的文件手動指定分隔符:如下:對打印後的內容手動指定分隔符“#”並顯示:

[root@localhost awk]# awk  -F ':' '{print $1"#"$2"#"$3}'   test.txt         #手動對打印後的內容分隔符以"#"爲分隔符顯示:
root#x#0
bin#x#1
daemon#x#2
adm#x#3

注意:指定分隔符後該命令只識別指定的分隔符,如果莫行無指定分隔符,則會打印整行:

2.2:awk的匹配功能(用 "~" 來表示匹配)

針對數學表達式的用法

  • 數值比較

當'$3>=1000 {print $1}'時:
[root@adai003 awk]# awk -F ':' '$3>=1000 {print $1}' test.txtuser001

當'$3>="1000" {print $1}'時:
[root@adai003 awk]# awk -F ':' '$3>="1000" {print $1}' test.txt |head -3daemon
adm
lp

匹配字符串:
[root@adai003 awk]# awk -F ':' '$7!="/sbin/nologin" ' test.txt root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltuser001:x:1000:1000::/home/user001:/bin/bash“!=”表示不等於

說明: 當“1000”加引號時會被當做是字符串,以ASC碼(二進制)的方式進行計算處理,不加引號的時候會被當做是數值處理。

[root@adai003 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"'root:x:0:0:root:/root:/bin/bashroot:x:1:1:bin:/bin:/sbin/nologinroot:x:2:2:daemon:/sbin:/sbin/nologin[root@adai003 awk]# awk -F ':' '$3=="0" {print $1}' test.txtroot

說明: 當使用一個“=”等號時表示爲等號前面字符賦值,使用兩個“==”表示邏輯關係(進行判斷)。

9.7 awk 命令(下)

  • 字符比較大小

[root@adai003 awk]# awk -F ':' '$3<$4' test.txtadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@adai003 awk]# awk -F ':' '$3==$4' test.txt |head -3root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@adai003 awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt shutdown:x:6:0:shutdown:/sbin:/sbin/shutdowntss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

說明: “&&”表示並且。

[root@adai003 awk]# awk -F ':' '$3>1000 || $7!="/sbin/nologin"' test.txt root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltuser001:x:1000:1000::/home/user001:/bin/bash[root@adai003 awk]# awk -F ':' '$3>1000 || $7~/bash/' test.txt root:x:0:0:root:/root:/bin/bashuser001:x:1000:1000::/home/user001:/bin/bash

說明: “||”表示或者。

OFS指定打印時的分隔符

語法1:
[root@adai003 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/ {print $1,$3,$7}' test.txt root#0#/bin/bashuser001#1000#/bin/bash語法2:
[root@adai003 awk]# awk -F ':' '{OFS="#"} {if ($3>1000 || $7~/bash/) {print $1,$3,$7}}' test.txt root#0#/bin/bashuser001#1000#/bin/bash
  • NR (=number row)表示行號

[root@adai003 awk]# awk -F ':' '$3<5 && $7!="/sbin/nologin" {print NR":"$1}' test.txt1:root[root@adai003 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NR":"$1}' test.txt4:adm5:lp打印前三行:
[root@adai003 awk]# awk -F ':' 'NR<=3' test.txtroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@adai003 awk]# awk -F ':' 'NR<=3 && $1~/root/' test.txtroot:x:0:0:root:/root:/bin/bash

注: 類似於grep -n。

  • NF (=number fragment)表示段數(列)

[root@adai003 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NF":"$1}' test.txt7:adm7:lp
  • 求和

[root@adai003 awk]#  awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt5657










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