awk命令詳解

awk命令

  • awk也是流式編輯器,針對文檔中的行和段進行操做 awk能夠分爲幾個部分:
  • 匹配字符或者字符串
  • 截取文檔中的某一段
  • 條件操做符
  • 數學運算
  • 內置變量

實例1:

  • head -n2 test.txt|awk -F ':' '{print $1}'
  • head -n2 test.txt|awk -F ':' '{print $0}'
  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  • awk '/oo/' test.txt
  • awk -F ':' '$1 ~/oo/' test.txt
  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  • awk -F ':' '$3=="0"' /etc/passwd
  • awk -F ':' '$3>="500"' /etc/passwd
  • awk -F ':' '$3>=500' /etc/passwd
  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

匹配字符或者字符串

  • 匹配root的行
[root@yong-02 sed]# awk '/root/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
  • awk能夠作到匹配某一段中的某個字符,以:分隔,匹配第一段中帶有root的行
[root@yong-02 sed]# awk -F ":" '$1 ~/root/'  test.txt
root:x:0:0:root:/root:/bin/bash
  • awk匹配字符能夠使用正則 匹配/roo?/
[root@yong-02 sed]# awk '/roo?/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • awk自帶脫意功能,grep脫意須要-E或者egrep,sed脫意須要-r選項 匹配‘oo+’的行
[root@yong-02 sed]# awk -F ":" '/oo+/'  test.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

grep -Ebash

[root@yong-02 sed]# grep -E 'oo+'  test.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

sed –rssh

[root@yong-02 sed]# sed -n -r '/oo+/'p  test.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 '分隔符' 若是不指定分隔符,默認會以空格或者空白字符分隔。打印第一段
[root@yong-02 sed]# awk -F ":" '{print $1}' test.txt |head -5
root
bin
daemon
adm
lp
  • 打印所有內容;$0表示所有內容
[root@yong-02 sed]# awk -F ":" '{print $0}' test.txt |head -5
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
  • 打印第1段~第4段
[root@yong-02 sed]# awk -F ":" '{print $1,$2,$3,$4}' test.txt |head -5
root x 0 0
bin x 1 1
daemon x 2 2
adm x 3 4
lp x 4 7
  • 注意:這裏打印出來了第1到第4段,可是內容沒有分隔符,這裏咱們加個分隔符,分隔符要以雙引號引發來;後面咱們會介紹一個變量OFS來進行分隔。
[root@yong-02 sed]# awk -F ":" '{print $1"#"$2"#"$3"#"$4}' test.txt |head -5
root#x#0#0
bin#x#1#1
daemon#x#2#2
adm#x#3#4
lp#x#4#7
  • awk能夠支持多個匹配
  • 匹配到root打印第1和第3段,匹配到user打印第1,第3,第4段。
[root@yong-02 sed]# awk -F ":" '/root/{print $1,$3} /user/{print $1,$3,$4}' test.txt
root 0
operator 11
user2 1009 1009
user3 1010 1010
user4 1011 1011
user5 1012 1012
user7 1014 1014
  • |在正則裏面表示或者
  • 打印出匹配到root或者user的行
[root@yong-02 sed]# awk '/root|bash/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
user4:x:1011:1011::/home/user4:/bin/bash
  • ||也是而且的意思,可是用法仍是有一點區別,
[root@yong-02 sed]# awk '/root/||/bash/' test.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash

條件操做符

  • == 等於,精確匹配
  • >大於
  • >= 大於等於
  • < 小於
  • <= 小於等於
  • != 不等於
  • 打印出第3段等於0的行
[root@yong-02 sed]# awk -F ":" '$3==0' test.txt
root:x:0:0:root:/root:/bin/bash
  • 打印出第3段大於等於500的行
[root@yong-02 sed]# awk -F ":" '$3>=500' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
  • 注意'500'和"500"區別:雙引號引發來的500會把它當成字符,會按照阿斯瑪排序,單用號引發來的500是數字。
[root@yong-02 sed]# awk -F ":" '$3>=500' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
[root@yong-02 sed]# awk -F ":" '$3>="500"' test.txt
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
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
  • 打印出第7段不是/sbin/nologin的行
[root@yong-02 sed]# awk -F ":" '$7!="/sbin/nologin"' test.txt
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
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
  • 而且&&和或者||
[root@yong-02 sed]# awk -F ":" '$3>500 && $3<1005' test.txt
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
yyl:x:1001:1002::/home/yyl:/bin/bash
  • 或者||
[root@yong-02 sed]# awk -F ":" '$3>1000 || $7=="/bin/bash"' test.txt
root:x:0:0:root:/root:/bin/bash
yyl:x:1001:1002::/home/yyl:/bin/bash
user2:x:1009:1009::/home/user2:/bin/bash
user3:x:1010:1010::/home/user3:/bin/bash
  • 兩個字段進行運算
[root@yong-02 sed]# awk -F ":" '$3>$4' test.txt
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

awk內置變量

  • awk經常使用的變量有OFS,NR和NF
  • OFS 用來指定分隔符號
  • NR 表示行數
  • NF 表示段數
  • 指定#爲分隔符
[root@yong-02 sed]# awk -F ":" '{OFS="#"} $3>500 {print $1,$3,$5}' test.txt
polkitd#999#User for polkitd
chrony#998#
yyl#1001#
user2#1009#
user3#1010#
  • 用awk打印前5行,並顯示行號
[root@yong-02 sed]# awk -F ":" 'NR <6 {print NR ":" $0 }' test.txt
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • 用awk打印18行之後的行,並顯示行號
[root@yong-02 sed]# awk -F ":" 'NR >18 {print NR ":" $0 }' test.txt
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
20:yyl:x:1001:1002::/home/yyl:/bin/bash
21:user2:x:1009:1009::/home/user2:/bin/bash
22:user3:x:1010:1010::/home/user3:/bin/bash
  • awk中能夠使用if判斷
[root@yong-02 sed]# awk -F ":" '{OFS="#"} {if ($3>500) {print $1,$2,$3}}' test.txt
polkitd#x#999
chrony#x#998
yyl#x#1001
user2#x#1009
user3#x#1010

awk中的數學運算

  • awk能夠更改段值  將第一段所有更改成root
[root@yong-02 sed]# awk -F ":" '$1="root"' test.txt |head -5
root x 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
root x 3 4 adm /var/adm /sbin/nologin
root x 4 7 lp /var/spool/lpd /sbin/nologin
  • awk能夠計算某個段的值  求第3段和
[root@yong-02 sed]# awk -F ':' '{(total=total+$3)}; END {print total}' test.txt 
5625
相關文章
相關標籤/搜索