当前位置: 首页 > news >正文

awk命令详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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 -E

[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 –r

[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

转载于:https://my.oschina.net/u/3791387/blog/1802076

相关文章:

  • Linux use apktool problem
  • 小程序页面授权后,页面显示问题
  • Nowcoder84D
  • python 函数
  • 思考:真正的分布式数据库是否让“数据湖”概念成为历史?
  • Eclipse Photon即将发布
  • 诡异的量子自杀
  • pyqt5 动画在QThread线程中无法运行问题
  • Spring Boot 定时任务
  • mybatis-generator逆向工程生成boolean字段解决办法
  • MySQL 高可用性keepalived+mysql
  • 今天来尝个鲜——vCenter6.7 + ESXi6.7
  • springcloud微服务学习之ribbon
  • 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去
  • solr cloud搭建
  • css选择器
  • Docker容器管理
  • Java超时控制的实现
  • js作用域和this的理解
  • QQ浏览器x5内核的兼容性问题
  • RxJS: 简单入门
  • 爱情 北京女病人
  • 从零开始在ubuntu上搭建node开发环境
  • 大数据与云计算学习:数据分析(二)
  • 服务器从安装到部署全过程(二)
  • 简析gRPC client 连接管理
  • nb
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • #{} 和 ${}区别
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (TOJ2804)Even? Odd?
  • (力扣题库)跳跃游戏II(c++)
  • (一) springboot详细介绍
  • (转)http-server应用
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .aanva
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET BackgroundWorker
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net 知识杂记
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ C++ ] 继承
  • [].slice.call()将类数组转化为真正的数组
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [ajaxupload] - 上传文件同时附件参数值
  • [C#]扩展方法
  • [C\C++]读入优化【技巧】
  • [codevs 1515]跳 【解题报告】
  • [delphi]保证程序只运行一个实例
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表