awk命令

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Young_Linux/article/details/79575859

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

匹配字符或者字符串
  1. 匹配root的行

    
    
  1. [root @localhost ~] # awk '/root/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. operator: x: 11 : 0 :operator :/root :/sbin/nologin

2 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行


    
    
  1. [root @localhost ~] # awk -F ':' '$1 ~ /root/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  1. awk匹配字符可以使用正则

    
    
  1. [root @localhost ~] # awk '/ooo?/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. lp: x: 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  4. mail: x: 8 : 12 :mail :/var/spool/mail :/sbin/nologin
  5. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  6. postfix: x: 89 : 89 : :/var/spool/postfix :/sbin/nologin
  1. awk自带脱意功能,grep脱意需要-E或者egrep,sed脱意需要-r选项

    
    
  1. [root @localhost ~] # awk -F ':' '/oo+/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. lp: x: 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  4. mail: x: 8 : 12 :mail :/var/spool/mail :/sbin/nologin
  5. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  6. postfix: x: 89 : 89 : :/var/spool/postfix :/sbin/nologin

grep -E


    
    
  1. [root @localhost ~] # grep -E 'oo+' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. lp: x: 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  4. mail: x: 8 : 12 :mail :/var/spool/mail :/sbin/nologin
  5. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  6. postfix: x: 89 : 89 : :/var/spool/postfix :/sbin/nologin

sed –r


    
    
  1. [root @localhost ~] # sed -n -r '/oo+/'p 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. lp: x: 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  4. mail: x: 8 : 12 :mail :/var/spool/mail :/sbin/nologin
  5. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  6. postfix: x: 89 : 89 : :/var/spool/postfix :/sbin/nologin
截取文档中的某一段
  • awk –F '分隔符' 如果不指定分隔符,默认会以空格或者空白字符分隔。
  1. 打印第一段

    
    
  1. [ root@localhost ~]# head -5 1.txt |awk -F ':' '{print $1}'
  2. root
  3. bin
  4. daemon
  5. adm
  6. lp
  1. 打印全部内容;$0表示全部内容

    
    
  1. [root @localhost ~] # head -5 1.txt |awk -F ':' '{print $0}'
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. bin: x: 1 : 1 :bin :/bin :/sbin/nologin
  4. daemon: x: 2 : 2 :daemon :/sbin :/sbin/nologin
  5. adm: x: 3 : 4 :adm :/var/adm :/sbin/nologin
  6. lp: x: 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  1. 打印第1段~第4段

    
    
  1. [ root@localhost ~]# head -5 1.txt |awk -F ':' '{print $1,$2,$3,$4}'
  2. root x 0 0
  3. bin x 1 1
  4. daemon x 2 2
  5. adm x 3 4
  6. lp x 4 7
  • 注意:这里打印出来了第1到第4段,但是内容没有分隔符,这里我们加个分隔符,分隔符要以双引号引起来;后面我们会介绍一个变量OFS来进行分隔。

    
    
  1. [root@localhost ~] # head -5 1.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  2. root #x#0#0
  3. bin #x#1#1
  4. daemon #x#2#2
  5. adm #x#3#4
  6. lp #x#4#7
  • awk可以支持多个匹配
  1. 匹配到root打印第1和第3段,匹配到user打印第1,第3,第4段。

    
    
  1. [ root@localhost ~]# awk -F ':' '/root/{print $1,$3} /user/ {print $1,$3,$4}' 1.txt
  2. root 0
  3. operator 11
  4. tss 59 59
  5. user3 1004 1003
  6. user4 1005 1003
  7. user5 1007 1006
  8. user6 1008 1003
  9. user7 1009 1009
  • |在正则里面表示或者
  1. 打印出匹配到root或者user的行

    
    
  1. [root @localhost ~] # awk '/root|bash/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  4. wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash
  5. user7: x: 1009 : 1009 : :/home/user7 :/bin/bash
  1. ||也是并且的意思,但是用法还是有一点区别,

    
    
  1. [root @localhost ~] # awk '/root/||/bash/' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  4. wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash
  5. user7: x: 1009 : 1009 : :/home/user7 :/bin/bash

条件操作符

  • == 等于,精确匹配
  • 大于

  • = 大于等于

  • < 小于
  • <= 小于等于
  • != 不等于

  1. 打印出第3段等于0的行
[root@localhost ~]# awk -F ':' '$3=='0'' 1.txt

    
    
  1. 打印出第3段大于等于500的行

    
    
  1. [root @localhost ~] # awk -F ':' '$3>='500'' 1.txt
  2. systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin
  3. polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin
  4. chrony: x: 997 : 995 : :/var/lib/chrony :/sbin/nologin
  5. wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash
  6. user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin
  7. user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin
  8. user5: x: 1007 : 1006 : :/home/user5 :/bin/login
  9. user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin
  10. user7: x: 1009 : 1009 : :/home/user7 :/bin/bash
  1. 注意'500'和"500"区别:双引号引起来的500会把它当成字符,会按照阿斯玛排序,单用号引起来的500是数字。

    
    
  1. [root @localhost ~] # awk -F ':' '$3>="500"' 1.txt
  2. shutdown: x: 6 : 0 :shutdown :/sbin :/sbin/shutdown
  3. halt: x: 7 : 0 :halt :/sbin :/sbin/halt
  4. mail: x: 8 : 12 :mail :/var/spool/mail :/sbin/nologin
  5. nobody: x: 99 : 99 :Nobody :/ :/sbin/nologin
  6. systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin
  7. dbus: x: 81 : 81 :System message bus:/ :/sbin/nologin
  8. polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin
  9. tss: x: 59 : 59 :Account used by the trousers package to sandbox the tcsd daemon:/dev/ null:/sbin/nologin
  10. postfix: x: 89 : 89 : :/var/spool/postfix :/sbin/nologin
  11. sshd: x: 74 : 74 :Privilege-separated SSH:/var/empty/ sshd:/sbin/nologin
  12. chrony: x: 997 : 995 : :/var/lib/chrony :/sbin/nologin
  1. 打印出第7段不/sbin/nologin的行

    
    
  1. [root @localhost ~] # awk -F ':' '$7!="/sbin/nologin"' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. sync: x: 5 : 0 :sync :/sbin :/bin/sync
  4. shutdown: x: 6 : 0 :shutdown :/sbin :/sbin/shutdown
  5. halt: x: 7 : 0 :halt :/sbin :/sbin/halt
  6. wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash
  7. user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin
  8. user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin
  9. user5: x: 1007 : 1006 : :/home/user5 :/bin/login
  10. user7: x: 1009 : 1009 : :/home/user7 :/bin/bash
  1. 并且&&和或者||

    
    
  1. [root @localhost ~] # awk -F ':' '$3>'1000' && $3<'1009'' 1.txt
  2. user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin
  3. user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin
  4. user5: x: 1007 : 1006 : :/home/user5 :/bin/login
  5. user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin
  1. 或者||

    
    
  1. [root @localhost ~] # awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  3. wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash
  4. user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin
  5. user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin
  6. user5: x: 1007 : 1006 : :/home/user5 :/bin/login
  7. user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin
  8. user7: x: 1009 : 1009 : :/home/user7 :/bin/bash
  1. 两个字段进行运算

    
    
  1. [root @localhost ~] # awk -F ':' '$3>$4' 1.txt
  2. sync: x: 5 : 0 :sync :/sbin :/bin/sync
  3. shutdown: x: 6 : 0 :shutdown :/sbin :/sbin/shutdown
  4. halt: x: 7 : 0 :halt :/sbin :/sbin/halt
  5. operator: x: 11 : 0 :operator :/root :/sbin/nologin
  6. systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin
  7. polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin
  8. chrony: x: 997 : 995 : :/var/lib/chrony :/sbin/nologin
  9. user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin
  10. user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin
  11. user5: x: 1007 : 1006 : :/home/user5 :/bin/login
  12. user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin

awk内置变量
  • awk常用的变量有OFS,NR和NF
  • OFS 用来指定分隔符号
  • NR 表示行数
  • NF 表示段数
  1. 指定#为分隔符

    
    
  1. [root@localhost ~] # awk -F ':' '{OFS="#"} $3>"5" {print $1,$2,$3,$4}' 1.txt
  2. shutdown #x#6#0
  3. halt #x#7#0
  4. mail #x#8#12
  5. nobody #x#99#99
  6. systemd-bus-proxy #x#999#997
  7. dbus #x#81#81
  8. polkitd #x#998#996
  9. tss #x#59#59
  10. postfix #x#89#89
  11. sshd #x#74#74
  12. chrony #x#997#995
  1. 用awk打印前5行,并显示行号

    
    
  1. [root @localhost ~] # head -5 1.txt|awk -F ':' '{print NR":"$0}'
  2. 1 :root :x : 0 : 0 :root :/root :/bin/bash
  3. 2 :bin :x : 1 : 1 :bin :/bin :/sbin/nologin
  4. 3 :daemon :x : 2 : 2 :daemon :/sbin :/sbin/nologin
  5. 4 :adm :x : 3 : 4 :adm :/var/adm :/sbin/nologin
  6. 5 :lp :x : 4 : 7 :lp :/var/spool/lpd :/sbin/nologin
  1. 用awk打印20行以后的行,并显示行号

    
    
  1. [root @localhost ~] # awk -F ':' 'NR>20 {print NR":"$0}' 1.txt
  2. 21 :chrony :x : 997 : 995 : :/var/lib/chrony :/sbin/nologin
  3. 22 :wuzhou :x : 1000 : 1000 : :/home/wuzhou :/bin/bash
  4. 23 :user3 :x : 1004 : 1003 : :/home/user3 :/sbin/nolongin
  5. 24 :user4 :x : 1005 : 1003 : :/home/user4 :/sbin/nolongin
  6. 25 :user5 :x : 1007 : 1006 : :/home/user5 :/bin/login
  7. 26 :user6 :x : 1008 : 1003 : :/home/wuzhou :/sbin/nologin
  8. 27 :user7 :x : 1009 : 1009 : :/home/user7 :/bin/bash
  1. awk中可以使用if判断

    
    
  1. [root @localhost ~] # awk -F ':' '{OFS="#"} {if($3>'1000'){print $1,$2,$3}}' 1.txt
  2. user3 #x#1004
  3. user4 #x#1005
  4. user5 #x#1007
  5. user6 #x#1008
  6. user7 #x#1009

awk中的数学运算

  • awk可以更改段值
  1. 将第一段全部更改为root

    
    
  1. [ root@localhost ~]# head -5 1.txt|awk -F ':' '$1="root"'
  2. root x 0 0 root /root /bin/bash
  3. root x 1 1 bin /bin /sbin/nologin
  4. root x 2 2 daemon /sbin /sbin/nologin
  5. root x 3 4 adm / var/adm /sbin/nologin
  6. root x 4 7 lp / var/spool/lpd /sbin/nologin
  • awk可以计算某个段的值
  1. 求第3段和

    
    
  1. [ root@localhost ~]# awk -F ':' '{(oto=oto+$3)}; END {print oto}' 1.txt
  2. 9694
  1. 打印出第一段是root的行

    
    
  1. [root @localhost ~] # awk -F ':' '{if ($1=="root") {print $0}}' 1.txt
  2. root: x: 0 : 0 :root :/root :/bin/bash
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值