系统相关
首页 > 系统相关> > 技能篇:awk教程-linux命令

技能篇:awk教程-linux命令

作者:互联网

前言

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

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

程序结构

awk命令模式:

awk工作流程

image.png

BODY语句块执行解析

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

运行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})    
符号 说明 示例
^ 指数操作符 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 '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等
$ 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
$ awk 'BEGIN { print ENVIRON["USER"] }'
csc
$ awk 'END {print FILENAME}' test.txt
test.txt
$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }
9

欢迎指正文中错误

参考文章

标签:语句,教程,str,BEGIN,csc,awk,lwl,linux
来源: https://www.cnblogs.com/cscw/p/14878531.html