5分钟入门AWK

作者: 编程说书酱 | 来源:发表于2019-01-04 16:54 被阅读0次

    AWK是Linux上卓越的文本处理工具,它具有非常简单的语法结构,拥有强大的文本处理能力。AWK 是一种解释执行的编程语言,AWK 的名称是由它们设计者的名字缩写而来 —— Afred Aho, Peter Weinberger 与 Brian Kernighan。

    目前总共有如下几种不同的 AWK 版本。

    AWK——这个版本是 AWK 最原初的版本,它由 AT&T 实验室开发。

    NAWK ——NAWK(New AWK)是 AWK 的改进增强版本。

    GAWK—— GAWK 即 GNU AWK,所有的 GNU/Linux 发行版都包括 GAWK,且 GAWK 完全兼容 AWK 与 NAWK。

    AWK 可以做非常多的工作。 下面只是其中部分 AWK 的典型应用场景:

    文本处理,

    生成格式化的文本报告,

    进行算术运算,

    字符串操作,以及其它更多。

    linux 默认安装了gawk,使用which gawk,如果输出/bin/gawk,说明已经安装了gawk,否则需要我们安装,可以使用 yum 包管理工具安装:

    [root]# yum install gawk

    另外我们也可以通过源码编译的方式安装gawk:

    step 1——从可信的源下载源代码。可以在命令行使用 wget 命令下载。

    [jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz

    step 2——解压并提取下载的源代码。

    [jerry]$ tar xvf gawk-4.1.1.tar.xz

    step 3——切换至解压后的目录并运行 configure 命令

    [jerry]$ ./configure

    step 4——configure 命令成功执行后会生成一个 Makefile 文件。 接下来使用 make 命令编译源代码。

    [jerry]$ make

    step 5——你可以运行测试工具保证 build 是干净的。 这一步是可选的。

    [jerry]$ make check

    step 6——最后一步,安装 AWK。 安装前请确认你有超级用户的权限。

    [jerry]$ sudo make install

    通过以上六个步骤,你就成功地编译并安装了 AWK。 你可以通过如下的命令来确认 awk 安装成功:

    gawk的版本通过: gawk --version 查看

    [jerry]$ which awk

    执行上面的命令,你将会得到如下的结果:

    /usr/bin/awk

    awk的工作流程:

    读( Read )、执 行( Execute )与重复( Repeat )

    读入一行执行一行,直到文件末尾。

    gawk的程序结构:

    开始块(BEGIN block),以大写BEGIN开头,必须大写,这一部分是可选的,可有可无。如:

    BEGIN {awk-commands}

    主体块(Body Block),如:

    /pattern/ {awk-commands}

    结束块(END Block),以大写END结束,必须大写,这一部分是可选的,可有可无。如:

    END {awk-commands}

    awk的整体语法格式是: awk '/pattern/ {action}' file 

    其中单引号是为了和shell命令区分开;

    /pattern/ 是一个过滤器,匹配这个模式的行才会被action的命令处理;

    {}是一个命令组,action是具体执行的命令;

    file是要处理的文件

    其中/pattern/ 和{action}必须要有一个,

    awk可以直接在命令行执行执行命令,也可以通过编写好脚本,然后执行脚本。

    通过命令行的方式:

    输出marks.txt文件的内容:

    [jerry]$ awk '{print}' marks.txt 

    再比如输出tomcat日志:

    gawk '{print}' /usr/local/apache-tomcat-8.0.30/logs/catalina.out

    另外一种提供 AWK 命令的方式——通过脚本文件提供:

    awk [option] -f file ....

    首先,创建一个文本文件 command.awk,在文件中输入如下 AWK 命令:

    {print}

    现在,我们可以调用 AWK 从文本文件中读入命令并执行。这里,我们实现了与上面例子相同的效果:

    [jerry]$ awk -f command.awk marks.txt

    awk有一些标准选项:

    -v 选项

    这个选项可以为变量赋值。它允许在程序执行之前为变量赋值。下面是一个 -v 选项使用的示例程序:

    [jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'

    执行上面的命令可以得到如下的结果:

    Name = Jerry

    --dump-variables[=file] 选项

    此选项会将全局变量及相应值按序输出到指定文件中。默认的输出文件名是 awkvars.out。

    [jerry]$ awk --dump-variables ''

    [jerry]$ cat awkvars.out 

    awk的基本使用示例:

    默认情况下,如果某行与模式串匹配,AWK 会将整行输出:

    [jerry]$ awk '/a/ {print}' marks.txt

    这个输出marks.txt文件中匹配 a 字符的所在行。

    输出某一列,比如输出第三列:

    [jerry]$ awk '/a/ {print $3}' marks.txt

    统计模式串成功匹配的次数,并将该结果打印出来:

    [jerry]$ awk '/JVM/ {++count} END {print count }' catalina.out 

    输出字符数多于 18 的行:

    [jerry]$ awk 'length($0) > 18' marks.txt

    查询文件中匹配的字符:

    awk '/uid=10001/' catalina.out

    在catalina.out文件中找匹配uid=10001的行,和 grep类似的功能。

    awk '/uid=10*/' catalina.out

    awk数组操作,比如删除数组的元素:

    [jerry]$ awk 'BEGIN {

    fruits["mango"]="yellow";

    fruits["orange"]="orange";

    delete fruits["orange"];

    print fruits["orange"]

    }'

    awk的逻辑语言ifelse:

    [jerry]$ awk 'BEGIN {

    a=30;

    if (a==10)

      print "a = 10";

    else if (a == 20)

      print "a = 20";

    else if (a == 30)

      print "a = 30";

    }'

    awk的循环:

    [jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'

    [jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'

    awk里面有很多内置函数,数学函数,字符串函数,日期函数等。

    还可以自定义函数。

    awk也可以把输出重定向到文件:

    [jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'

    >> 双大于号是追加。

    awk也可以使用管道:

    [jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'

    相关文章

      网友评论

        本文标题:5分钟入门AWK

        本文链接:https://www.haomeiwen.com/subject/kcjkrqtx.html