awk用法简介
来源:互联网 发布:农村淘宝一单赚多少钱 编辑:程序博客网 时间:2024/05/21 18:31
转载链接:https://chhy2009.github.io/2017/07/08/awk/
与sed工具类似,awk是一种优秀的行文本处理工具。其具有内置的变量和函数,可以进行正则表达式的匹配,流程控制,数学运算。事实上,可以说awk是一种编程语言。
awk程序结构
任何awk语句都由模式(pattern)及动作(action)组成。其中模式是一组用于测试输入行是否需要执行动作的规则,动作则是找到匹配内容后的执行动作(包含语句、函数和表达式的执行过程)。调用方式
awk [-F field-separator] 'pattern{action}' filename 其中,pattern和action都可以省略不写。无pattern默认匹配全部的记录;而无action则是打印原始记录。简单的AWK表达式之外,pattern可以是BEGIN或END;这两种条件对应的action分别是读取所有的记录之前和之后。 filename可以用|输入替代。
几个概念
- BEGIN 及 END 语句
awk定义了两个特殊字段BEGIN和END,分别在程序开始前和结束前执行,相当于类的构造及析构函数。 awk的执行过程: 执行BEGIN语句,然后按行处理输入文本,最后执行END语句。 - 记录和域
awk 认为纪录是结构化的,awk将输入文件按行处理,行中每个字符串定义为域,域中用分隔符分隔(通常以空格或, :等分隔),如:
lrwxr-xr-x 1 root wheel 8 Jun 26 2016 binlrwxr-xr-x 1 root wheel 8 Jun 26 2016 include
上面的输入有2行,每行有9个域
域在awk中用$N表示,其中N=1、2..., $0表示整条纪录
awk编程
- awk 内置变量
AWK的内建变量包括域变量,例如$1, $2, $3,以及$0。这些变量给出了记录中域的内容。 内建变量也包括一些其他变量:
- NR:已输入记录的条数。- NF:当前记录中域的个数。记录中最后一个域可以以$NF的方式引用。- FILENAME:当前输入文件的文件名。- FS:“域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。- RS:当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。- OFS:“输出域分隔符”,即分隔print命令的参数的符号。其默认值为空格。- ORS:“输出记录分隔符”,即每个print命令之间的符号。其默认值为换行符。- OFMT:“输出数字格式”(Format for numeric output),其默认值为"%.6g"。
- 函数 awk内置和很多函数,当然也可以自定义函数,示例如下:
awk 'function add_three (number) { return number + 3}BEGIN {result=add_three(1); print result}'
上面的例子输出4.
- awk脚本 可以使用awk脚本的方式来执行awk命令,awk脚本模版如下,与命令行方式类似:
#! /bin/awk -f BEGIN{} {} END{}
- 匹配
可以使用awk 'BEGIN {FS=","} {if($1~/xxx/) print $2 >>data.txt}' filename
来提取匹配的域,其中xxx为匹配的正则表达式
格式化 可以使用printf来代替print,输出格式化的文本。格式符和c语言类似,常用的为%d,%s,
循环及条件语句 awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
条件语句为if/else,与C语言也相同
awk中使用shell命令
- 通过getline函数,获取命令执行结果
通过在awk内使用管道,可以把shell命令的输出传送给awk
$ awk 'BEGIN{ "date" | getline date; print date; }' Sat Jul 8 22:04:20 HKT 2017
如果不使用管道,则getline默认从标准输入读取输入字符,这时不能当命令执行;
可以使用<,让getline从文件中读取内容- 使用awk内置system函数
awk 'BEGIN{system("ls -l")}'
执行结果如下:
total 16lrwxr-xr-x 1 root wheel 8 Jun 26 2016 X11 -> /opt/X11lrwxr-xr-x 1 root wheel 8 Jun 26 2016 X11R6 -> /opt/X11drwxr-xr-x 3 root wheel 102 Feb 27 2016 adicdrwxr-xr-x 1055 root wheel 35870 Jun 19 2016 bin...
搭配getline使用,则为:
awk 'BEGIN{while(system("ls -l") | getline line) {print line}}'
3. 使用awk print出要执行的命令,然后交给/bin/bash处理awk 'BEGIN{print "ls -l"|"bash"}'
以下是一篇比较好的文章,可供参考:
linux awk命令详解
awk官方文档注意:
可以将awk命令写在文件中,然后用awk -f awk-script-file filename 方式执行,其中脚本中的#!/bin/sh改为#!/bin/awk 当变量不从管道输入awk时,awk无法引用已经定义的变量
- AWK 用法简介
- awk用法简介
- awk基本用法简介
- linux awk 用法简介
- awk用法简介
- Linux AWK 命令用法简介
- awk简介
- AWK简介
- awk 简介
- awk简介
- awk简介
- AWK简介
- awk 简介
- awk简介
- awk用法
- awk用法
- awk 用法
- AWK 用法
- IO之流输入输出FileInputStream和FileOutputStream
- Bigdata Development Java_Study_04(interface 堆,栈)
- JavaScript常见问题整理
- 多进程的Python实现
- Android使用已有的sqlite数据库的方法
- awk用法简介
- 欢迎使用CSDN-markdown编辑器
- hdu 2034 人见人爱A-B
- express模拟mock数据
- C语言学习:信号屏蔽字sigset_t,sigprocmask,sigpending
- 九度oj 题目1467:二叉排序树
- 浅谈五大Python Web框架
- LeetCode 7. Reverse Integer
- hdu 2035 人见人爱A^B