查看原文
其他

Shell正则三剑客 | awk命令

刘宝龙 杰哥的IT之旅 2019-05-08

AWK命令

awk 具有 grep 和 sed命令的特性,同时 AWK针对列进行匹配

语法格式

  1. Usage: awk [options] -f progfile [--] file ...

  2. Usage: awk [options] [--] 'program' file ...

常用选项

  • -F fs fs指定输入分隔符,fs可以是字符串或正则表达式;如-F ":"

  • -vvar=value 赋值一个用户定义变量,将外部变量传递给awk

  • -f progfile 从脚本文件中读取awk命令

  • -m[fr]val 对val值设置内在限制;

  • -mf选项限制分配给val的最大块数目;

  • -mr选项限制记录最大数目;

  • 此选项为awk的扩展功能,在标准awk中不适用;

awk使用案例

  1. ## $1 $2...$n 表示字段;$0 表示所有字段

  2. head -n2 test.txt | awk -F ":" '{print $0}'

  3. head -n2 test.txt | awk -F ":" '{print $1}'

  4. ## 输入字段分隔符

  5. head -n2 test.txt | awk -F ":" '{print $1"#"$2"#"$3}'

  6. head -n2 test.txt | awk -F ":" '{OFS="#"}{print $1,$2,$3}'

  7. ## 字符串过滤【具有grep过滤功能】

  8. awk -F ":" '/root/' test.txt ## 匹配字符串为root的行

  9. awk -F ":" '$1 ~/root/' test.txt ## 匹配第一字段包含root的行

  10. ## awk的数学运算

  11. awk -F ":" '$3>$4' /etc/passwd

  12. awk -F ":" '$3>800 ||  $7=="/bin/bash"' /etc/passwd

  13. awk -F ":" '$7!="/sbin/nologin"' /etc/passwd

  14. ## if判断用例

  15. awk -F ":" '{if($1=="root"){print $0} }' text

  16. awk -F ":" '{if($3>=20){print $3}}' text

  17. ## awk的循环

  18. awk -F ":" '{(tot=tot+$3)}; END {print tot}' text

awk小练习

打印行号【awk/grep实现】

  1. ## awk写法

  2. [root@shell awk]# awk -F ":" '/root/{print NR":"$0}' /etc/passwd

  3. 1:root:x:0:0:root:/root:/bin/bash

  4. 10:operator:x:11:0:operator:/root:/sbin/nologin

  5. ## grep写法

  6. [root@shell awk]# grep -n 'root' /etc/passwd

  7. 1:root:x:0:0:root:/root:/bin/bash

  8. 10:operator:x:11:0:operator:/root:/sbin/nologin

匹配包含 root 的行【awk/grep实现】

  1. ## awk写法

  2. [root@shell awk]# awk -F ":" '/root/' /etc/passwd

  3. root:x:0:0:root:/root:/bin/bash

  4. operator:x:11:0:operator:/root:/sbin/nologin

  5. ## grep写法

  6. [root@shell awk]# grep 'root' /etc/passwd

  7. root:x:0:0:root:/root:/bin/bash

  8. operator:x:11:0:operator:/root:/sbin/nologin

匹配第一字段为 root的行

  1. [root@shell awk]# awk -F ":" '$1 ~/root/' /etc/passwd

  2. root:x:0:0:root:/root:/bin/bash

  3. rootaaaaa:x:0:0:root:/root:/bin/bash

  4. irootaaaaa:x:0:0:root:/root:/bin/bash

匹配包含root 或 bash 的行【awk/grep实现】

  1. ## awk写法(一)

  2. [root@shell awk]# awk -F ":" '/root|bash/ {print $0}' /etc/passwd

  3. root:x:0:0:root:/root:/bin/bash

  4. operator:x:11:0:operator:/root:/sbin/nologin

  5. ## awk写法(二)

  6. [root@shell awk]# awk -F ":" '/root/ || /bash/ {print $0}' /etc/passwd

  7. root:x:0:0:root:/root:/bin/bash

  8. operator:x:11:0:operator:/root:/sbin/nologin

  9. ## grep写法

  10. [root@shell awk]# grep -E "root|bash" /etc/passwd

  11. root:x:0:0:root:/root:/bin/bash

  12. operator:x:11:0:operator:/root:/sbin/nologin

匹配数学运算

  1. ## 匹配 $3等于字符串0

  2. [root@shell awk]# awk -F ":" '$3=="0"' /etc/passwd

  3. root:x:0:0:root:/root:/bin/bash

  4. ## 匹配 $3 大于等于字符串 10

  5. [root@ansible-master awk]# head -n 5 text |awk -F ":" '$3>="10"'

  6. rootaaaaa:x:10:0:root:/root:/bin/bash

  7. daemon:x:2:2:daemon:/sbin:/sbin/nologin

  8. ## 匹配 $3 大于等于数字 10

  9. [root@ansible-master awk]# head -n 5 text |awk -F ":" '$3>=10'

  10. rootaaaaa:x:10:0:root:/root:/bin/bash

  11. ## 匹配$7字段 不等于字符串·/bin/nologin·

  12. [root@ansible-master awk]# head -n 5 text |awk -F ":" '$7!="/bin/nologin"'

  13. root:x:0:0:root:/root:/bin/bash

  14. rootaaaaa:x:10:0:root:/root:/bin/bash

  15. irootaaaaa:x:01:0:root:/root:/bin/bash

  16. bin:x:1:1:bin:/bin:/sbin/nologin

  17. daemon:x:2:2:daemon:/sbin:/sbin/nologin

匹配字段添加分隔符

  1. ## 方法1

  2. [root@shell awk]# awk -F ":" '{OFS="#"} /root|bash/ {print $1,$2,$5}' /etc/passwd

  3. root#x#root

  4. operator#x#operator

  5. ## 方法2

  6. [root@shell awk]# awk -F ":" '/root|bash/ {print $1"#"$2"#"$5}' /etc/passwd

  7. root#x#root

  8. operator#x#operator

匹配条件字段

  1. [root@shell awk]# awk -F ":" '{OFS="#"}{if($3>800){print $1,$3,$7}}' /etc/passwd

  2. polkitd#999#/sbin/nologin

  3. chrony#998#/sbin/nologin

  4. jenkins#997#/bin/false

  5. saslauth#996#/sbin/nologin

NR和$NR区别

  • NR 表示,只打印行号

  • $NR 表示,根据当前行号打印相应字段(比如:第1行,打印 $1字段;第2行,打印$2字段)

  1. ## NR 表示,只打印行号

  2. [root@ansible-master awk]# head -6 text | awk -F ":" '{print NR, $0}'

  3. 1 root:x:0:0:root:/root:/bin/bash

  4. 2 bin:x:1:1:bin:/bin:/sbin/nologin

  5. 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

  6. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin

  7. 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  8. 6 sync:x:5:0:sync:/sbin:/bin/sync

  9. ## 匹配NR 大于 20 的行

  10. [root@ansible-master awk]# awk -F ":" 'NR>20 {print NR,$0}' text

  11. 21 chrony:x:998:996::/var/lib/chrony:/sbin/nologin

  12. 22 jenkins:x:997:993:Jenkins Automation Server:/var/lib/jenkins:/bin/false

  13. 23 saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin

  14. 24 mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin

  15. 25 smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin

  16. ## $NR 表示,根据当前行号打印相应的字段

  17. [root@ansible-master awk]# head -6 text | awk -F ":" '{print $NR, $0}'

  18. root root:x:0:0:root:/root:/bin/bash

  19. x bin:x:1:1:bin:/bin:/sbin/nologin

  20. 2 daemon:x:2:2:daemon:/sbin:/sbin/nologin

  21. 4 adm:x:3:4:adm:/var/adm:/sbin/nologin

  22. lp lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  23. /sbin sync:x:5:0:sync:/sbin:/bin/sync

awk的条件判断使用

  1. ## 判断,如果$1字段 等于 字符串root 则打印

  2. [root@ansible-master awk]# awk -F ":" '{if($1=="root"){print $0} }' text

  3. root:x:0:0:root:/root:/bin/bash

  4. ## 判断,如果$3字段 大于 数字20 则打印

  5. [root@ansible-master awk]# awk -F ":" '{if($3>=20){print $3}}' text

  6. 99

  7. 192

  8. 81

  9. 999

awk的循环

  1. ## 求和 文件所有第3列

  2. [root@ansible-master awk]# awk -F ":" '{(tot=tot+$3)}; END {print tot}' text

  3. 4707

更多awk用法可参考:http://man.linuxde.net/awk


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存