linux下字符串处理工具二:awk(1)

awk工作原理

原理图

第一步:awk对文件或管道的内容一次只处理一次,将获取到的这一行赋给内部变量$0。
这里写图片描述
第二步:这一行的内容按awk内部变量FS定义的分隔符,缺省为空格(包括tab制表符)分解成字段,每一段存储在从$1开始的变量中。
这里写图片描述
第三步:awk中print命令打印字段;{print $1,$3} 只取有用的第一段和第三段;在打印时$1和$3之间由空格间隔。“,”逗号是一个映射到内部的输出字段分隔符(OFS),OFS变量缺省为空格,逗号在输出时被空格替换。接下来,awk处理下一行数据,直到所有的行处理完。
例子:
截取部分/etc/passwd的内容在5.txt 中作为例子

➜  awkstudy  cat 5.txt
_spotlight:*:89:89:Spotlight:/var/empty:/usr/bin/false
_tokend:*:91:91:Token Daemon:/var/empty:/usr/bin/false
_securityagent:*:92:92:SecurityAgent:/var/db/securityagent:/usr/bin/false
_calendar:*:93:93:Calendar:/var/empty:/usr/bin/false
_teamsserver:*:94:94:TeamsServer:/var/teamsserver:/usr/bin/false

打印所有的5.txt的内容

awk '{print $0}' 5.txt 或者
awk '{print}' 5.txt

代码块 {print} 单独出现的时候,会打印一整行的东西={print $0}

awk '{print ""}' 5.txt

会打印出与5.txt中行数相等的空行

awk '{print "hello"}' 5.txt

会打印出与5.txt行数相等的hello

基本示例

入门例子

awk -F":" '{print $1,$4}' 5.txt
_spotlight 89
_tokend 91
_securityagent 92
_calendar 93
_teamsserver 94
awk -F":" '{print $1 $4}' 5.txt
_spotlight89
_tokend91
_securityagent92
_calendar93
_teamsserver94
awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' 5.txt
username: _spotlight        uid:89
username: _tokend       uid:91
username: _securityagent        uid:92
username: _calendar     uid:93
username: _teamsserver      uid:94

awk内建变量

awk内建变量

用法示例

设置字段分隔符号(FS使用方法)

awk 'BEGIN{FS=":"}{print NR,$1,$NF}' 5.txt
或者:
awk -F":" '{print NR,$1,$NF}' 5.txt

记录条数(NR,FNR使用方法)

awk -F":" '{print NR,$1,$NF}' /etc/passwd

设置输出字段分隔符(OFS使用方法)

awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
12^^root^^/bin/sh

设置输出行记录分隔符(ORS使用方法)

awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' 5.txt

输入参数获取(ARGC ,ARGV使用)

awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' 5.txt

ARGC=2
0=awk
1=5.txt

获得linux环境变量(ENVIRON使用)

awk 'BEGIN{print ENVIRON["PATH"];}'
/Users/enyilr/.jenv/bin:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin:/Users/enyilr/javatools/apache-maven-3.3.3/bin:/Users/enyilr/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

ENVIRON是子典型数组,可以通过对应键值获得它的值。

RSTART RLENGTH使用

awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
11 11 4
awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }'
0 0 -1

RSTART 被匹配正则表达式首的位置,RLENGTH匹配字符长度,没有找到为-1.

参考:https://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值