awk指令用法详解

Posted Overboom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk指令用法详解相关的知识,希望对你有一定的参考价值。

1. awk概述

1.1 awk命名历史

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

1.2 awk的作用

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk程序的报告生成能力通经常使用来从大文本文件里提取数据元素并将它们格式化成可读的报告。最完美的样例是格式化日志文件。

2. awk知识点

2.1 awk语法

awk基本语法如下:

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

  • 首先,执行关键字 BEGIN 标识的 {} 中的命令;
  • 完成 BEGIN 大括号中命令的后,开始执行 body 命令;
  • 逐行读取数据,默认读到 \\n 分割的内容为一条 记录,其实就是行的概念;
  • 将记录按照指定的分隔符划分为 字段,其实就是列的概念;
  • 循环执行 body 块中的命令,每读取一行,执行一次 body,最终完成 body 执行;
  • 最后,执行 END 命令,通常会在 END 中输出最后的结果;
    awk 是输入驱动的,有多少输入行,就会执行多少次 body 命令。

我们在下边的示例学习中,要时刻记着:记录 (Record) 就是行,字段 (Field) 就是列,BEGIN 是预处理阶段,body 是 awk 真正工作的阶段,END 是最后处理阶段。
第一步:运行BEGIN{ commands }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行。然后运行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行反复这个过程。直到文件所有被读取完成。
第三步:当读至输入流末尾时。运行END{ commands }语句块。
这三个部分缺少任何一部分都可以。

2.2 awk常见概念和知识点

(一)内置变量

  1. 每一行内容记录,叫做记录,英文名称 Record
  2. 每行中通过分隔符隔开的每一列,叫做字段,英文名称 Field

明确这几个概念后,我们来总结几个重要的内置变量
NR:表示当前的行数;
NF:表示当前的列数;
RS:行分隔符,默认是换行;
FS:列分隔符,默认是空格和制表符;
OFS:输出列分隔符,用于打印时分割字段,默认为空格
ORS:输出行分隔符,用于打印时分割记录,默认为换行符

(二)输出格式

awk 提供 printf 函数进行格式化输出功能,具体的使用方式和 C 语法基本一致。

基本用法

printf("%12s, %02d, %.2f\\n", s, d, g);

常用的格式化方式:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%e 指数形式的浮点数
%x %X 无符号以十六进制表示的整数
%0 无符号以八进制表示的整数
%g 自动选择合适的表示法
\\n 换行符
\\t Tab符

(三)编程语句
awk 不仅是一个 Linux 命令行工具,它其实是一门脚本语言,支持程序设计语言所有的控制结构,它支持:

条件语句
循环语句
数组
函数

(四)常用函数
awk 内置了大量的有用函数功能,也支持自定义函数,允许你编写自己的函数来扩展内置函数。

这里只简单罗列一些比较常用的字符串函数:

index(s, t) 返回子串 t 在 s 中的位置
length(s) 返回字符串 s 的长度
split(s, a, sep) 分割字符串,并将分割后的各字段存放在数组 a 中
substr(s, p, n) 根据参数,返回子串
tolower(s) 将字符串转换为小写
toupper(s) 将字符串转换为大写

3. 实际需求举例 / 实战学习

3.1 输出一个文件的某几列

overboom@overboom:~/test$ ll
total 8
drwxrwxr-x  2 overboom overboom 4096 922 22:43 ./
drwxr-xr-x 23 overboom overboom 4096 922 22:43 ../
-rw-rw-r--  1 overboom overboom    0 922 22:43 1.txt
-rw-rw-r--  1 overboom overboom    0 922 22:43 2.txt
-rw-rw-r--  1 overboom overboom    0 922 22:43 3.txt
-rw-rw-r--  1 overboom overboom    0 922 22:43 4.txt
-rw-rw-r--  1 overboom overboom    0 922 22:43 5.txt
overboom@overboom:~/test$ ll > log.txt
overboom@overboom:~/test$ awk '{print $1, $4}' log.txt
total 
drwxrwxr-x overboom
drwxr-xr-x overboom
-rw-rw-r-- overboom
-rw-rw-r-- overboom
-rw-rw-r-- overboom
-rw-rw-r-- overboom
-rw-rw-r-- overboom
-rw-rw-r-- overboom

1> awk ‘{print $1, $4}’ log.txt中大括号里边的就是 awk 语句,只能被单引号包含
2> $N表示引用第N列,特别注意$0表示整行内容

3.2 指定分隔符

上面示例的文件默认是以空格/tab为分隔符的,我们的数据,不总是以空格为分隔符,
(一) 通过 FS 变量指定分隔符

(二)通过 -F 选项指定分割符

(三)同一文件可能用到多个分割符,如何指定?
用 -F ‘[;:]’指定多个分隔符

(四)使用OFS指定输出分隔符

这里虽然指定了***作为输出分隔符,但是原来的逗号分隔符并没有去掉,如何去掉,自己百度?

3.3 使用运算符过滤记录

awk 支持各种比较运算符号 !=、>、=

3.4 条件匹配

列出第三列包含woman的,以及第一行

3.5 字符串

awk 内置支持一系列的字符串函数,length 计算字符串长度,toupper 函数转换字符串为大写。

3.6 if语句

awk支持if语句

3.7 统计

第 5 列表示文件大小,每读取一行就会将该文件大小计算到 sum 变量中,在最后 END 阶段打印出 sum,也就是所有文件的大小总和。

参看链接:
https://cloud.tencent.com/developer/article/1702227?from=14588
https://cloud.tencent.com/developer/article/1072072?from=14588
https://www.linuxidc.com/Linux/2018-01/150361.htm
https://www.linuxprobe.com/linux-awk-clever.html
https://blog.51cto.com/leomars/1956197
https://www.lxlinux.net/4707.html

以上是关于awk指令用法详解的主要内容,如果未能解决你的问题,请参考以下文章

AWK用法详解

Linux下的awk用法详解

awk用法详解

Linux下的awk用法详解

awk 用法详解

1.12-linux三剑客之awk用法详解