技能篇:awk教程-linux命令
前言
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命令的更多相关文章
- Linux基石【第四篇】基本Linux命令
Linux 系统上一切皆文件 命令: pwd -- 查看当前目录 / 代表根目录 clear -- 清屏命令 cd(change directory) -- 切换目录 cd / -- 切换到根目录 ...
- (技能篇)Mysql在linux下的全量热备份
相关命令: #创建备份目录 mkdir -p /mysqlbackup #进入创建的备份目录中 cd /mysqlbackup #如果mysql运行在mysql用户和用户组下面,root表示用户,my ...
- 开发必备linux命令大全-稳赚不亏
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...
- 007 Linux 命令三剑客之-awk
01 一起来认识 awk! Linux 命令三剑客,sed.grep.awk. sed:擅长数据修改. grep:擅长数据查找定位. awk:擅长数据切片,数据格式化,功能最复杂. awk 更适合格式 ...
- 77个常用Linux命令和工具
77个常用Linux命令和工具 Linux管理员不能单靠GUI图形界面吃饭.这就是我们编辑这篇最实用Linux命令手册的原因.这个指南是特别为Linux管理员和系统管理员 设计的,汇集了最有用的一些工 ...
- Linux 命令详解(七)Systemd 入门教程:命令篇
Systemd 入门教程:命令篇http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
- 技能篇:shell教程及脚本编写
前言 我们常时不会见到shell脚本,但是需要阅读开发linux脚本时,这又是一项必不可少的技能.本文在于提供基础的shell编程语法和简单的实例,帮助同学快速开发,可当做shell手册使用也非常善 ...
- 【转帖】Systemd 入门教程:命令篇
Systemd 入门教程:命令篇 Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...
- 技能篇:linux服务性能问题排查及jvm调优思路
只要业务逻辑代码写正确,处理好业务状态在多线程的并发问题,很少会有调优方面的需求.最多就是在性能监控平台发现某些接口的调用耗时偏高,然后再发现某一SQL或第三方接口执行超时之类的.如果你是负责中间件或 ...
随机推荐
- POJ1611基础带权并查集
题意: 有一个人生病了,和他一个社团或者间接和他有联系的人都会生病,问一共有多少人生病了. 思路: 比较简单和基础的题,带权并查集中的一种,就是记录更新集合元素个数,这个题目我 ...
- python中实现打印特定字符变换
首先需要将 lib文件 放在该文件同一目录 使用的时候,先导入 from lib.common import print_msg ,然后调用里面的 print_msg() 方法即可! lib文件地址: ...
- Win64 驱动内核编程-5.内核里操作文件
内核里操作文件 RING0 操作文件和 RING3 操作文件在流程上没什么大的区别,也是"获得文件句柄->读/写/删/改->关闭文件句柄"的模式.当然了,只能用内核 A ...
- Windows PE变形练手2-开发一套自己的PE嵌入模板
PE嵌入模板 编写一段代码,生成一个已经处理过重定位信息,同时所有的内容都在代码段里,并且没有导入表的PE程序,把这个程序嵌入到其他PE的相关位置,能够独立的运行,接下来是整理了2个模板,一个是Hel ...
- windows安装TeX Live 2019及TeXstudio
废话不多说,先放资源链接: 链接:https://pan.baidu.com/s/1XYXNJvmVfBoe9rSdTnZDBw 提取码:xjor视频安装教程我会在评论区放上B站链接(如果我有心情剪的 ...
- linux当前运行进程
一:linux查询服务器服务进程 inux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照, 就是执行ps命令的那个时刻的 ...
- 【opencv】Java+eclipse+opencv 环境搭建 helloword入门demo
文章为博主原创,纯属个人理解,如有错误欢迎指出. 如需转载,请注明出处. 引入jar包 引入配置文件 到此环境配置完成!!! 可能会出现的问题: 1. jdk版本不一致导致发生异常.如图 build ...
- Identity Server4 数据迁移、持久化
add-migration InitialPersistedGrantDb -c PersistedGrantDbContext -o Migrations/IdentityServer/Persis ...
- MSSQL·CLI执行T-SQL
阅文时长 | 0.44分钟 字数统计 | 480.8字符 主要内容 | 1.引言&背景 2.详细步骤&排坑指南 3.中途执行异常处理方式 4.声明与参考资料 『MSSQL·CLI执行T ...
- K8S的资源管理
K8S的资源管理 管理K8S资源的三种基本方法: 陈述式资源管理方法-使用cli工具进行管理. 声明式资源管理方式-主要依耐资源配置清单. GUI式资源管理方法-主要依耐图形界面. 陈述式资源管理方法 ...