博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk编程
阅读量:4049 次
发布时间:2019-05-25

本文共 2156 字,大约阅读时间需要 7 分钟。

一,基本语法

awk基本语法

awk ‘script’  files
awk '{pattern + action}' 或者 awk 'pattern {action}'

二,变量

在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义。变量的类型可以是数字、字符串。根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文。下面为变量的赋值负号列表:

符号 含义 等价形式
= a = 5 a = 5
+= a = a + 5 a += 5
-= a = a - 5 a -= 5
*= a = a * 5 a *= 5
/= a = a / 5 a /= 5
%= a = a % 5 a %= 5
^= a = a ^ 5 a ^= 5
 除此之外,awk还提供了一组
内建变量(变量名全部大写),见如下列表:

变量名 变量内容
ARGC 命令行参数的数量。
ARGIND 命令行正在处理的当前文件的AGV的索引。
ARGV 命令行参数数组。
CONVFMT 转换数字格式。
ENVIRON 从shell中传递来的包含当前环境变量的数组。
ERRNO 当使用close函数或者通过getline函数读取的时候,发生的重新定向错误的描述信息就保存在这个变量中。
FIELDWIDTHS 在对记录进行固定域宽的分割时,可以替代FS的分隔符的列表。
FILENAME 当前的输入文件名。
FNR 当前文件的记录号。
FS 输入分隔符,默认是空格。
IGNORECASE 在正则表达式和字符串操作中关闭大小写敏感。
NF 当前文件域的数量。
NR 当前文件记录数。
OFMT 数字输出格式。
OFS 输出域分隔符。
ORS 输出记录分隔符。
RLENGTH 通过match函数匹配的字符串的长度。
RS 输入记录分隔符。
RSTART 通过match函数匹配的字符串的偏移量。
SUBSEP 下标分隔符。

三:awk规定引用外部变量必须使用单引号加双引号,即'"$sysvar"'这样的格式,但是split函数也需要双引号来定界,但这个双引号又不能让sh解释,而应留给awk来解释,所以使用了\"和\"组成的双引号

name="76868&5676&435&43526&334&12312312&12321"

awk 'BEGIN {print split(('"\"$name\""', filearray, "&")}'

注意与下面的区别:

awk 'BEGIN {name="76868&5676&435&43526&334&12312312&12321";  print split(name, filearray, "&") ;print filearray[1]}'

四,字符串连接操作

 将几个字符串连接起来使用"";如果使用+号,会自动转换为数值。

例如:awk 'BEGIN{a=100;b=200;c=(a""b);print c}' 

输出:100200

如果是这样:awk 'BEGIN{a=100;b=200;c=(a+b);print c}' 

输出:300

再如:awk 'BEGIN{a="a";b="bb";c=(a+b);print c}'  

输出:0

五,重定向

在 动作语句中使用shell通用的重定向输出符号">"就可以完成awk的重定向操作

 awk '$4 >= 70 {print $1,$2 > "passing_file"}' filename  #注意这里的文件名需要用双引号括起来。

awk中对于输入重定向是通过getline函数来完成的。getline函数的作用是从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得 输入。

语法:awk 'BEGIN { "command" | getline d; print d}'

对于command中,对于局部变量要使用加双引用,对于命令本身中要加双引号的地方改成\" \"。

例如:cat /etc/shadow | awk 'BEGIN {FS=":";ta="19700101 +"};{tc=ta""$3" days"; "date --date=\""tc"\" +%Y%m%d" | getline bb} ; {print $1,$2,bb}'

再如:head -n4 /etc/shadow | awk 'BEGIN {FS=":";OFS="\t"};{"date --date=\"19700101 +"$3" days\" +%Y%m%d" | getline expir};{print $1,$2,expir}'

date --date="string" 对于此命令来说,如果string中有空格,那必须加双引号。为此,对于输入重定向 动作中上,就应把里面的双引号改为\",并且对于里面用到的变量加上双引号"$3"或"tc"

参考:

http://www.cnblogs.com/mchina/archive/2012/06/30/2571317.html

http://blog.sina.com.cn/s/blog_4d1f40c00100r7y3.html

你可能感兴趣的文章
excel 查找一个表的数据在另一个表中是否存在
查看>>
centos 7 上配置dnsmasq 同时支持ipv4和ipv6的DHCP服务
查看>>
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
微信小程序开发全线记录
查看>>