awk命令及用法

awk 工具

awk是行處理器: 相比較屏幕處理的優勢,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,一般用來格式化文本信息,awk命令在執行時不會直接更改文件的內容。正則表達式

  • awk '{print $1,$3}' filename打印文件中每行的第一第三段(默認段的分隔符爲空格)
  • awk -F ':' '{print $1,$3}' filename 打印文件中每行的第一第三段(-F選項是指定分隔符爲:)
[root@localhost tmp]# awk '{print $0}' 2.txt 
sss ssd dd gg  dd  asdf  gasdf
123 fqe fasd f fasd f ad  df aaf
 dfa sdf fasd fad fa df a 
 a df:fadf:afsdf:fad@afa@afad@afasd
fadf#asff#fasdf#afdas`
  • 這一段沒有指定分隔符,而且$0的意思是打印全部段=cat命令
[root@localhost tmp]# awk '{print $1}' 2.txt 
sss
123
dfa
a
fadf#asff#fasdf#afdas`
  • awk '{print $1}' 2.txt 這條命令是打印文件中每行的第一段(默認分段符是空格)
  • awk -F ':' '{print $1}' 2.txt 這條命令式指定:爲分段符,且打印每行的第一段
[root@localhost tmp]# awk -F ':' '{print $1}' 2.txt 
sss ssd dd gg  dd  asdf  gasdf
123 fqe fasd f fasd f ad  df aaf
 dfa sdf fasd fad fa df a 
 a df
  • 指定顯示在屏幕上的分段符 awk '{print $1"#"$2"#"$3"#"$4}' filename
[root@localhost tmp]# awk '{print $1"#"$2"#"$3"#"$4}' 2.txt 
sss#ssd#dd#gg
123#fqe#fasd#f
dfa#sdf#fasd#fad
a#df:fadf:afsdf:fad@afa@afad@afasd##

顯示出來的內容每段之間以#隔開bash

  • awk也能夠列出指定關鍵字的行 awk '/oo/' filename 列出含有oo的行
[root@localhost awk]# awk '/oo/' 1.txt 
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • ~匹配符號,awk -F ':' '$1~/oo/' 1.txt 列出1.txt中第一段能匹配到oo的行
[root@localhost awk]# awk -F ':' '$1~/oo/' 1.txt
root:x:0:0:root:/root:/bin/bash
  • awk命令一樣支持正則表達式awk -F ':' '$1~/oo+/' 1.txt
[root@localhost awk]# awk -F ':' '/oo+/' 1.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  • awk命令還支持多條正則表達式一塊兒寫awk -F':' '/root/{print $1,$2} /user/{print $3,$4}' 1.txt
[root@localhost awk]# awk -F ':' '/root/{print $1,$3} /user/{print $3,$4}' 1.txt
root 0
operator 11
  • awk -F ':' '$3==0{print $0}' 1.txt 列出第三段等於0的行
  • awk -F ':' '$3>=1000{print $0}' 1.txt 列出第三段大於等於1000的行
  • awk -F ':' '$7!="/sbin/nologin"{print $0}' 1.txt列出第七段不是/sbin/nologin的行
[root@localhost awk]#  awk -F ':' '$3==0{print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash
[root@localhost awk]# awk -F ':' '$3>=1000{print $0}' 1.txt
lic:x:1000:1000::/home/lic:/bin/bash
[root@localhost awk]# awk -F ':' '$7!="/sbin/nologin"{print $0}' 1.txt
aabbccdd
AABBCCDD
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
lic:x:1000:1000::/home/lic:/bin/bash
  • awk -OFS 指定分隔符 awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/' 1.txt
  • NR行號,NF段號
[root@localhost awk]# awk -F':' '{print NR"@"$0}' 1.txt
1@aabbccdd        顯示行號
2@AABBCCDD
3@root:x:0:0:root:/root:/bin/bash
4@bin:x:1:1:bin:/bin:/sbin/nologin
5@daemon:x:2:2:daemon:/sbin:/sbin/nologin
6@adm:x:3:4:adm:/var/adm:/sbin/nologin
7@lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
8@sync:x:5:0:sync:/sbin:/bin/sync
9@shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@localhost awk]# awk -F':' '{print NF"@"$0}' 1.txt
1@aabbccdd    顯示每行多少段
1@AABBCCDD
7@root:x:0:0:root:/root:/bin/bash
7@bin:x:1:1:bin:/bin:/sbin/nologin
7@daemon:x:2:2:daemon:/sbin:/sbin/nologin
7@adm:x:3:4:adm:/var/adm:/sbin/nologin
7@lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7@sync:x:5:0:sync:/sbin:/bin/sync
7@shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  • 賦值 = awk -F ':' 'NR<=10{$1="boot"}' 1.txt
[root@localhost awk]#  awk -F ':' 'NR<=10{$1="boot"}{print $0}' 1.txt >> 2.txt
[root@localhost awk]# cat 2.txt 
boot
boot
boot x 0 0 root /root /bin/bash
boot x 1 1 bin /bin /sbin/nologin
boot x 2 2 daemon /sbin /sbin/nologin
boot x 3 4 adm /var/adm /sbin/nologin
boot x 4 7 lp /var/spool/lpd /sbin/nologin
boot x 5 0 sync /sbin /bin/sync
boot x 6 0 shutdown /sbin /sbin/shutdown
boot x 7 0 halt /sbin /sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

NR<=10表示行號小於等於10 ,也就是前十行,{$1="boot"}就是給第一段賦值爲boot,後面依次是打印全部段,追加到2.txt中工具

  • 求和 awk -F':' '{(tot=tot+$3)};END{print tot}' 1.txt求全部行的第三段加起來的和值
[root@localhost awk]# awk -F':' '{(tot=tot+$3)};END{print tot}' 1.txt
2655
相關文章
相關標籤/搜索