前言

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. POJ1611基础带权并查集

    题意:       有一个人生病了,和他一个社团或者间接和他有联系的人都会生病,问一共有多少人生病了. 思路:       比较简单和基础的题,带权并查集中的一种,就是记录更新集合元素个数,这个题目我 ...

  2. python中实现打印特定字符变换

    首先需要将 lib文件 放在该文件同一目录 使用的时候,先导入 from lib.common import print_msg ,然后调用里面的 print_msg() 方法即可! lib文件地址: ...

  3. Win64 驱动内核编程-5.内核里操作文件

    内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...

  4. Windows PE变形练手2-开发一套自己的PE嵌入模板

    PE嵌入模板 编写一段代码,生成一个已经处理过重定位信息,同时所有的内容都在代码段里,并且没有导入表的PE程序,把这个程序嵌入到其他PE的相关位置,能够独立的运行,接下来是整理了2个模板,一个是Hel ...

  5. windows安装TeX Live 2019及TeXstudio

    废话不多说,先放资源链接: 链接:https://pan.baidu.com/s/1XYXNJvmVfBoe9rSdTnZDBw 提取码:xjor视频安装教程我会在评论区放上B站链接(如果我有心情剪的 ...

  6. linux当前运行进程

    一:linux查询服务器服务进程 inux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照, 就是执行ps命令的那个时刻的 ...

  7. 【opencv】Java+eclipse+opencv 环境搭建 helloword入门demo

    文章为博主原创,纯属个人理解,如有错误欢迎指出. 如需转载,请注明出处. 引入jar包 引入配置文件 到此环境配置完成!!! 可能会出现的问题: 1. jdk版本不一致导致发生异常.如图 build ...

  8. Identity Server4 数据迁移、持久化

    add-migration InitialPersistedGrantDb -c PersistedGrantDbContext -o Migrations/IdentityServer/Persis ...

  9. MSSQL·CLI执行T-SQL

    阅文时长 | 0.44分钟 字数统计 | 480.8字符 主要内容 | 1.引言&背景 2.详细步骤&排坑指南 3.中途执行异常处理方式 4.声明与参考资料 『MSSQL·CLI执行T ...

  10. K8S的资源管理

    K8S的资源管理 管理K8S资源的三种基本方法: 陈述式资源管理方法-使用cli工具进行管理. 声明式资源管理方式-主要依耐资源配置清单. GUI式资源管理方法-主要依耐图形界面. 陈述式资源管理方法 ...