前言

AWK是一门解释型的编程语言。用于文本处理,它的名字来源于它的三位作者的姓氏:Alfred Aho, Peter Weinberger 和 Brian Kernighan

  • awk 程序结构
  • 运行awk文件脚本
  • awk基础语法
  • awk 程序常用的内建变量

关注公众号,一起交流,微信搜一搜: 潜行前行

程序结构

awk命令模式:

  • awk ' BEGIN {awk-commands} /pattern/ {awk-commands} END {awk-commands}' fileName
  • 若存在匹配模式pattern,则需要用 / 包含
  • awk-commands 程序代码块必须被大括号
  • BEGIN语句块BEGIN {awk-commands}可选,它只执行一次,在这里可以初始化变量。BEGIN是AWK的关键字,必须为大写
  • BODY 语句块 /pattern/ {awk-commands},BODY语句块中的命令会对输入的每一行执行,可以通过提供模式来控制这种行为
  • END 语句块 END {awk-commands}可选,END语句块在程序的最后执行,END是AWK的关键字,必须为大写

awk工作流程

BODY语句块执行解析

脚本命令: awk '{ [代码语句1][代码语句2] }如果没有 fileName 或其他输入流,且存在BODY语句块,BODY语句块会进入死循环;代码语句表达式以分号结束,也可以用换行符结束

  • 1: 读入一行数据,并这一行的数据填入 $0;每一列的数据分别填入 $1, $2.... 等变量当中
  • 2: 执行 代码语句
  • 3: 若还有后续的行数据,则重复上面 1~2 的步骤,直到每一数据都读完为止

运行awk文件脚本

  • awk文件脚本以awk后缀结尾
  • 选项 [-f]:awk -f command.awk marks.txt

awk基础语法

  • awk变量不需要提前定义,也不许要指定类型
awk 'BEGIN{sum=1;print sum}'
1
  • 流程控制
#-------- 伪代码 1  ---------
if ({condition})
代码逻辑...
else if({condition})
代码逻辑...
else
代码逻辑...
#-------- 伪代码 2 ---------
for ({初始化}; {condition};{后续逻辑}){
代码逻辑...
}
#-------- 伪代码 3 ---------
while ({condition}){
代码逻辑...
}
#-------- 伪代码 4 ---------
do{
代码逻辑...
}while ({condition})
  • 运算符,基本和 java 编程语言一样 下面简单列举几个运算符
符号 说明 示例
^ 指数操作符 a = a ^ 2
-/+ 一元操作符 a = -10; a = +a;
condition ? action : action 三元操作符 (a > b) ? max = a : max = b;
&& / || 逻辑操作符 if (num >= 0 && num <= 7)
== / != 等于不等于 if (a == b)
awk 'BEGIN{sum=1;sum++; if(sum==2) print sum}'
2
  • 数组,AWK支持关联数组,也就是说,不仅可以使用数字索引的数组,还可以使用字符串作为索引;删除数组元素使用delete语句delete arr[0]
$ awk 'BEGIN {arr["lwl"] = 1; arr["csc"] = 2; for (i in arr) printf "arr[%s] = %d\n", i, arr[i]}'
arr[lwl] = 1
arr[csc] = 2
  • 字符串操作
---- 空格拼接字符,则默认使用逗哈作为拼接符 ----
awk 'BEGIN { str1 = "csc, "; str2 = "lwl"; str3 = str1 str2; print str3 }'
csc, lwl
  • 字符串相关的内建函数
index(str, sub) #获取sub在str起始索引
length(str) #获取str长度
match(str, regex) #str是否匹配regex模式
split(str, arr, regex)
sub(regex, sub, string)
substr(str, start, l)
tolower(str)
toupper(str)

正则表达式

  • 匹配符:~ 和 !~ 分别代表匹配和不匹配
$ awk '$0 !~ 9' marks.txt
1) Amit Physics 80
3) Shyam Biology 87
  • 匹配符和正则表达式
# log.txt内容文件
1 csc world
2 lwl hello
----------输出第二列包含lwl的行------------------------------
$ awk '$2 ~ /lwl/ {print $2,$3}' log.txt
lwl hello
------输出包含csc的行---------------------------
$ awk '/csc/ {print $0}' log.txt
1 csc world

awk 程序常用的内建变量

变量 描述
$n 当前记录的第n个字段,字段间由FS分隔
$0 完整的输入记录
ARGC 命令行参数的数目
ARGV 包含命令行参数的数组
ENVIRON 环境变量
ERRNO 最后一个系统错误的描述
FILENAME 当前文件名
FS 字段分隔符(默认是任何空格)
IGNORECASE 进行忽略大小写的匹配
NF 一条记录的字段的数目
NR 已经读出的记录数,就是行号,从1开始
FNR 和NR类似,不过如果存在多个输入文件,FNR当前文件的行号
OFS 输出 字段分隔符
ORS 输出 行分隔符
RLENGTH 由match函数所匹配的字符串的长度
RS 记录分隔符(默认是一个换行符)
RSTART 由match函数所匹配的字符串的第一个位置
ARGIND 循环处理数据时,当前被处理的ARGV的索引
PROCINFO 包含进程信息的关联数组,例如UID,进程ID等
  • ARGV 命令行参数个数
$ awk 'BEGIN {
for (i = 0; i < ARGC - 1; ++i) {
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
}' csc lwl
ARGV[0] = csc
ARGV[1] = lwl
  • ENVIRON 环境变量
$ awk 'BEGIN { print ENVIRON["USER"] }'
csc
  • FILENAME 当前文件名
$ awk 'END {print FILENAME}' test.txt
test.txt
  • RSTART,由match函数所匹配的字符串的第一个位置
$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }
9

欢迎指正文中错误

参考文章

技能篇:awk教程-linux命令的更多相关文章

  1. Linux基石【第四篇】基本Linux命令

    Linux 系统上一切皆文件 命令: pwd  -- 查看当前目录  / 代表根目录 clear -- 清屏命令 cd(change directory) -- 切换目录 cd / -- 切换到根目录 ...

  2. (技能篇)Mysql在linux下的全量热备份

    相关命令: #创建备份目录 mkdir -p /mysqlbackup #进入创建的备份目录中 cd /mysqlbackup #如果mysql运行在mysql用户和用户组下面,root表示用户,my ...

  3. 开发必备linux命令大全-稳赚不亏

    我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...

  4. 007 Linux 命令三剑客之-awk

    01 一起来认识 awk! Linux 命令三剑客,sed.grep.awk. sed:擅长数据修改. grep:擅长数据查找定位. awk:擅长数据切片,数据格式化,功能最复杂. awk 更适合格式 ...

  5. 77个常用Linux命令和工具

    77个常用Linux命令和工具 Linux管理员不能单靠GUI图形界面吃饭.这就是我们编辑这篇最实用Linux命令手册的原因.这个指南是特别为Linux管理员和系统管理员 设计的,汇集了最有用的一些工 ...

  6. Linux 命令详解(七)Systemd 入门教程:命令篇

    Systemd 入门教程:命令篇http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

  7. 技能篇:shell教程及脚本编写

    前言 我们常时不会见到shell脚本,但是需要阅读开发linux脚本时,这又是一项必不可少的技能.本文在于提供基础的shell编程语法和简单的实例,帮助同学快速开发,可当做shell手册使用也非常善 ...

  8. 【转帖】Systemd 入门教程:命令篇

    Systemd 入门教程:命令篇  Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...

  9. 技能篇:linux服务性能问题排查及jvm调优思路

    只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...

随机推荐

  1. idea使用lombok不生效

    问题: 在maven项目中引入lombok的依赖,可是依旧无法在实体类中生效 <dependency> <groupId>org.projectlombok</group ...

  2. Spring随堂笔记

    Spring 1.IoC控制反转 IoC特点不用new 就可以初始化类: 控制反转的英文名叫 Ioc(Inversion of Control) ,依赖注入英文名叫DI(Dependency Inje ...

  3. 一些代码小技巧&经典代码

    请说明逻辑与(&&)在下边表达式中起到的重要作用 count != 0 && sum/count 答:该表达式使用逻辑与(&&)来确保 sum/coun ...

  4. Vulkan移植GPUImage(五)从P到Z的滤镜

    现aoce_vulkan_extra把GPUImage里从P到Z的大部分滤镜用vulkan的ComputeShader实现了,也就是最后一部分的移植,整个过程相对前面来说比较简单,大部分我都是直接复制 ...

  5. linux下将一个大的文件拆分成若干小文件

    命令:split,例子: 以行数拆分 -l参数: split –l 50 原始文件 拆分后文件名前缀 说明:以50行对文件进行拆分,最后一个文件的行数没有50行以实际行数进行分配,比如有一个名为 wl ...

  6. MD5加密以及登录获取设置token

    MD5简介 MD5是不可逆的加密算法,基本上是不可破解的,网上有些破解网站,其实是利用了穷举法,因为MD5生成的串是一样的,他们会将常规的密码生成MD5加密串,保存,然后破解的时候去穷举比对.(应对之 ...

  7. linux服务之NTP及chrony时间同步

    博客园 首页 联系 管理   linux服务之NTP及chrony时间同步   一.NTP时间同步 NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步 ...

  8. 自动做bond的脚本

    #!/bin/bash # 先备份原来的网卡配置文件 find /etc/sysconfig/network-scripts/ -type f -name "ifcfg*"|xar ...

  9. RHEL/CentOS 7 中配置 PXE 网络启动服务器

    RHEL/CentOS 7 中配置 PXE 网络启动服务器 作者: Matei Cezar 译者: LCTT joeren | 2015-02-17 14:28   评论: 13 收藏: 8 分享:  ...

  10. Java EnumMap 实现类

    EnumMap 实现类 因为 HashMap 是一种通过对 key 计算 hashCode(),通过空间换时间的方式,直接定位到 value 所在的内部数组的索引,因此,查找效率非常高. 如果作为 k ...