awk命令

mac2024-10-15  52

版权声明:本文为博主原创文章,遵循 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.txtawk -F ':' '$1 ~/oo/' test.txtawk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txtawk -F ':' '$3=="0"' /etc/passwdawk -F ':' '$3>="500"' /etc/passwdawk -F ':' '$3>=500' /etc/passwdawk -F ':' '$7!="/sbin/nologin"' /etc/passwd

匹配字符或者字符串

匹配root的行 [root @localhost ~] # awk '/root/' 1.txt root: x: 0 : 0 :root :/root :/bin/bash operator: x: 11 : 0 :operator :/root :/sbin/nologin

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

[root @localhost ~] # awk -F ':' '$1 ~ /root/' 1.txt root: x: 0 : 0 :root :/root :/bin/bash awk匹配字符可以使用正则 [root @localhost ~] # awk '/ooo?/' 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自带脱意功能,grep脱意需要-E或者egrep,sed脱意需要-r选项 [root @localhost ~] # 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

grep -E

[root @localhost ~] # grep -E '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

sed –r

[root @localhost ~] # sed -n -r '/oo+/'p 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 '分隔符' 如果不指定分隔符,默认会以空格或者空白字符分隔。 打印第一段 [ root@localhost ~]# head -5 1.txt |awk -F ':' '{print $1}' root bin daemon adm lp 打印全部内容;$0表示全部内容 [root @localhost ~] # head -5 1.txt |awk -F ':' '{print $0}' 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@localhost ~]# head -5 1.txt |awk -F ':' '{print $1,$2,$3,$4}' root x 0 0 bin x 1 1 daemon x 2 2 adm x 3 4 lp x 4 7 注意:这里打印出来了第1到第4段,但是内容没有分隔符,这里我们加个分隔符,分隔符要以双引号引起来;后面我们会介绍一个变量OFS来进行分隔。 [root@localhost ~] # head -5 1.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}' 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@localhost ~]# awk -F ':' '/root/{print $1,$3} /user/ {print $1,$3,$4}' 1.txt root 0 operator 11 tss 59 59 user3 1004 1003 user4 1005 1003 user5 1007 1006 user6 1008 1003 user7 1009 1009 |在正则里面表示或者 打印出匹配到root或者user的行 [root @localhost ~] # awk '/root|bash/' 1.txt root: x: 0 : 0 :root :/root :/bin/bash operator: x: 11 : 0 :operator :/root :/sbin/nologin wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash user7: x: 1009 : 1009 : :/home/user7 :/bin/bash ||也是并且的意思,但是用法还是有一点区别, [root @localhost ~] # awk '/root/||/bash/' 1.txt root: x: 0 : 0 :root :/root :/bin/bash operator: x: 11 : 0 :operator :/root :/sbin/nologin wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash user7: x: 1009 : 1009 : :/home/user7 :/bin/bash

条件操作符

== 等于,精确匹配

大于

= 大于等于

< 小于<= 小于等于!= 不等于
打印出第3段等于0的行 [root@localhost ~]# awk -F ':' '$3=='0'' 1.txt 打印出第3段大于等于500的行 [root @localhost ~] # awk -F ':' '$3>='500'' 1.txt systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin chrony: x: 997 : 995 : :/var/lib/chrony :/sbin/nologin wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin user5: x: 1007 : 1006 : :/home/user5 :/bin/login user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin user7: x: 1009 : 1009 : :/home/user7 :/bin/bash 注意'500'和"500"区别:双引号引起来的500会把它当成字符,会按照阿斯玛排序,单用号引起来的500是数字。 [root @localhost ~] # awk -F ':' '$3>="500"' 1.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 systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin dbus: x: 81 : 81 :System message bus:/ :/sbin/nologin polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin tss: x: 59 : 59 :Account used by the trousers package to sandbox the tcsd daemon:/dev/ null:/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: 997 : 995 : :/var/lib/chrony :/sbin/nologin 打印出第7段不/sbin/nologin的行 [root @localhost ~] # awk -F ':' '$7!="/sbin/nologin"' 1.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 wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin user5: x: 1007 : 1006 : :/home/user5 :/bin/login user7: x: 1009 : 1009 : :/home/user7 :/bin/bash 并且&&和或者|| [root @localhost ~] # awk -F ':' '$3>'1000' && $3<'1009'' 1.txt user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin user5: x: 1007 : 1006 : :/home/user5 :/bin/login user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin 或者|| [root @localhost ~] # awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txt root: x: 0 : 0 :root :/root :/bin/bash wuzhou: x: 1000 : 1000 : :/home/wuzhou :/bin/bash user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin user5: x: 1007 : 1006 : :/home/user5 :/bin/login user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin user7: x: 1009 : 1009 : :/home/user7 :/bin/bash 两个字段进行运算 [root @localhost ~] # awk -F ':' '$3>$4' 1.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 systemd-bus- proxy: x: 999 : 997 :systemd Bus Proxy:/ :/sbin/nologin polkitd: x: 998 : 996 :User for polkitd:/ :/sbin/nologin chrony: x: 997 : 995 : :/var/lib/chrony :/sbin/nologin user3: x: 1004 : 1003 : :/home/user3 :/sbin/nolongin user4: x: 1005 : 1003 : :/home/user4 :/sbin/nolongin user5: x: 1007 : 1006 : :/home/user5 :/bin/login user6: x: 1008 : 1003 : :/home/wuzhou :/sbin/nologin

awk内置变量

awk常用的变量有OFS,NR和NFOFS 用来指定分隔符号NR 表示行数NF 表示段数 指定#为分隔符 [root@localhost ~] # awk -F ':' '{OFS="#"} $3>"5" {print $1,$2,$3,$4}' 1.txt shutdown #x#6#0 halt #x#7#0 mail #x#8#12 nobody #x#99#99 systemd-bus-proxy #x#999#997 dbus #x#81#81 polkitd #x#998#996 tss #x#59#59 postfix #x#89#89 sshd #x#74#74 chrony #x#997#995 用awk打印前5行,并显示行号 [root @localhost ~] # head -5 1.txt|awk -F ':' '{print NR":"$0}' 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打印20行以后的行,并显示行号 [root @localhost ~] # awk -F ':' 'NR>20 {print NR":"$0}' 1.txt 21 :chrony :x : 997 : 995 : :/var/lib/chrony :/sbin/nologin 22 :wuzhou :x : 1000 : 1000 : :/home/wuzhou :/bin/bash 23 :user3 :x : 1004 : 1003 : :/home/user3 :/sbin/nolongin 24 :user4 :x : 1005 : 1003 : :/home/user4 :/sbin/nolongin 25 :user5 :x : 1007 : 1006 : :/home/user5 :/bin/login 26 :user6 :x : 1008 : 1003 : :/home/wuzhou :/sbin/nologin 27 :user7 :x : 1009 : 1009 : :/home/user7 :/bin/bash awk中可以使用if判断 [root @localhost ~] # awk -F ':' '{OFS="#"} {if($3>'1000'){print $1,$2,$3}}' 1.txt user3 #x#1004 user4 #x#1005 user5 #x#1007 user6 #x#1008 user7 #x#1009

awk中的数学运算

awk可以更改段值 将第一段全部更改为root [ root@localhost ~]# head -5 1.txt|awk -F ':' '$1="root"' 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@localhost ~]# awk -F ':' '{(oto=oto+$3)}; END {print oto}' 1.txt 9694 打印出第一段是root的行 [root @localhost ~] # awk -F ':' '{if ($1=="root") {print $0}}' 1.txt root: x: 0 : 0 :root :/root :/bin/bash
最新回复(0)