zoukankan      html  css  js  c++  java
  • awk进阶整理

    BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译。为了能理清awk工具使用的思路,详情还要看awk说明书(man awk)
    或者http://www.gnu.org/software/gawk/manual/gawk.html#Regexp}
    awk初学之常见问题
    http://bbs.chinaunix.net/thread-2309494-1-1.html
    awk介绍

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。
    数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
    它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。
    它在命令行中使用,但更多是作为脚本来使用。
    awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

    awk命令格式和常用选项
    命令格式
    awk [options] 'script' var=value file(s)
    awk [options] -f scriptfile var=value file(s)
    常用选项
    -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
    -v var=value 赋值一个用户定义变量,将外部变量传递给awk
    -f scripfile 从脚本文件中读取awk命令

    awk的工作原理
    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
    第一步:执行BEGIN{ commands }语句块中的语句;
    第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,
    从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
    第三步:当读至输入流末尾时,执行END{ commands }语句块。

    BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,
    比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
    END语句块在awk从输入流中读取完所有的行之后即被执行,
    比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
    pattern语句块中的通用命令是最重要的部分,它也是可选的。
    如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

    AWK程序的完整执行方式
    AWK PROGRAM EXECUTION
    An AWK program consists of a sequence of pattern-action statements and optional function definitions.

    pattern { action statements }
    function name(parameter list) { statements }

    了解变量,记录和字段
    自定义变量 -v

    awk内置变量(预定义变量)
    内置变量
    Gawk的内置变量是:

    ARGC 命令行参数的数量(不包括gawk的选项或程序源)。

    ARGIND 正在处理的当前文件的ARGV中的索引。

    ARGV 命令行参数数组。该阵列从0到ARGC - 1索引。动态更改ARGV的内容可以控制用于的文件数据。

    BINMODE / O指定使用“二进制”模式。数字值为1,2或3,指定输入文件,输出文件或全部文件分别应使用二进制I / O。
    “r”或“w”的字符串值分别指定输入文件或输出文件应使用二进制文件I / O。
    “rw”或“wr”的字符串值指定所有文件应使用二进制I / O。任何其他字符串值被视为“rw”,但会生成警告信息。

    CONVFMT 默认情况下,数字的转换格式为“%.6g”。

    ENVIRON 包含当前环境值的数组。该数组由环境变量索引,每个元素都是该值的值变量(例如,ENVIRON [“HOME”]可能是/ home / arnold)。
    改变这个数组不影响通过gawk生成的程序所看到的环境重定向或system()函数。

    ERRNO 如果发生系统错误,或者对getline进行重定向,在readline的读取期间或在close()期间,则ERRNO将包含一个字符串描述错误。
    该价值需要翻译成非英文文字。

    FIELDWIDTHS 字段宽度的白色空格分隔列表。当设置时,gawk将输入解析为固定宽度的字段,而不是使用FS变量的值作为字段分隔符。

    FILENAME 当前输入文件的名称。如果在命令行中没有指定文件,则FILENAME的值为“ - ”。
    但是,FILENAME内部未定义BEGIN块(除非由getline设置)。

    FNR 当前输入文件中的输入记录号。
    http://www.cnblogs.com/irockcode/p/7044722.html

    FS 输入字段分隔符,默认为空格。请参阅上面的字段。

    IGNORECASE 控制所有正则表达式和字符串操作的区分大小写。如果IGNORECASE具有非零值,则进行字符串比较和模式规则匹配,
    FS分割,与RS记录分离,与〜和!〜的正则表达式匹配,gensub(),gsub(),index(),match(),split()和sub()
    内置函数在执行正则表达式操作时都会忽略大小写。
    注意:数组下标不受影响。
    但是,asort()和asorti()函数会受到影响。
    因此,如果IGNORECASE不等于零,/ aB /匹配所有字符串“ab”,“aB”,“Ab”和“AB”。
    与所有AWK变量一样,初始值为IGNORECASE为零,因此所有正则表达式和字符串操作通常区分大小写。
    在Unix下,完整的ISO 8859-1 Latin-1字符集被忽略的情况下使用。
    从gawk 3.1.4开始,基于C <ctype.h>的设备,如isalpha()和TOUPPER()。

    LINT 提供AWK程序内的--lint选项的动态控制。如果真的,gawk打印棉绒警告。
    当虚假的时候,它不会。分配时字符串值“致命”,lint警告成为致命错误,完全像--lint =致命。任何其他真正的值只是打印警告。

    NF 当前输入记录中的字段数。

    NR 迄今为止看到的输入记录总数。

    OFMT 默认情况下,数字的输出格式为“%.6g”。

    OFS 输出字段分隔符,默认为空格。

    ORS 输出记录分隔符,默认为换行符。

    PROCINFO 此数组的元素提供有关正在运行的AWK程序的信息的访问
    在某些系统上,阵列中可能有元素,“group1”通过“groupn”为一些n,这是进程的补充组的数量使用in操作符测试这些元素。

    RS 输入记录分隔符,默认为换行符。

    RT 记录终止符。 Gawk将RT设置为与RS指定的字符或正则表达式匹配的输入文本。

    RSTART 与match()匹配的第一个字符的索引; 0如果没有匹配。 (这意味着字符索引从一个开始。)

    RLENGTH 由match()匹配的字符串的长度; -1如果没有匹配。

    SUBSEP 用于在数组元素中分隔多个下标的字符,默认为“ 034”。

    TEXTDOMAIN AWK程序的文本域; 用于查找程序字符串的本地化翻译。



    awk数组
    关于awk数组的理解
    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2312439&highlight=awk%2B%CA%FD%D7%E9
    数组结合+=统计题
    http://www.cnblogs.com/irockcode/p/7044541.html
    去重
    awk '!a[$0]++' file
    http://www.cnblogs.com/irockcode/p/7044646.html
    awk变量类型和转换
    Variable Typing And Conversion

    八进制和十六进制常量

    字符串常量
    AWK中的字符串常量是双引号(“)之间的字符串,在字符串中,
    某些转义序列被识别,如C.

    \一个字面反斜杠。

    a“警报”字符; 通常是ASCII BEL字符。

    b退格。

    f表单。

    n换行。

    r回车。

    t水平选项卡。

    v垂直选项卡。

    xhex数字
    由 x之后的十六进制数字字符串表示的字符。 如ANSI C所有
    以下十六进制数字被视为转义序列的一部分。 (此功能应该告诉
    我们关于委员会的语言设计。)例如,“ x1B”是ASCII ESC(转义)字符。

    ddd由八位数字的1,2或3位数字表示的字符。 例如,“ 033”是
    ASCII ESC(转义)字符。

    c字面字符c。
    转义序列也可以在常量正则表达式内使用(例如/ [ t f n r v] / 匹配空格字符)。
    在兼容模式下,处理由八进制和十六进制转义序列表示的字符
    字面上用于正则表达式常量。因此,/ a 52b /相当于/ a * b /。

    awk模式和操作
    Patterns
    AWK 模式一般有以下几种:

    BEGIN
    END
    /regular expression/
    relational expression
    pattern && pattern
    pattern || pattern
    pattern ? pattern : pattern
    (pattern)
    ! pattern
    pattern1, pattern2


    正则表达式
    原本翻译了man的所有正则表达式,但想想还是删了,毕竟我只是用谷歌翻译,结果多少会有不准确
    这里就算是个总结吧,但有几点,正则表达式不是通用的,是看工具是否支持的
    通配符与正则也会有冲突
    附上晚上找的资料链接
    http://blog.csdn.net/miss_acha/article/details/24462519
    https://zhidao.baidu.com/question/2203723809768255508.html
    http://www.cnblogs.com/xiongyunqi/p/3735846.html
    http://bbs.chinaunix.net/thread-1049373-2-1.html
    正则表达式awk[完全手册]
    http://www.cnblogs.com/nhlinkin/p/3647357.html
    http://www.gnu.org/software/gawk/manual/gawk.html#Regexp

    操作(actions)
    动作语句用大括号{和}括起来。 行动声明包括通常的分配,条件和循环语句
    在大多数语言中发现。 运算符,控制语句和输入/输出语句可以在C之后进行图案化。

    AWK运算符
    Operators
    The operators in AWK, in order of decreasing precedence, are

    (...)Grouping

    $ Field reference.

    ++ --Increment and decrement, both prefix and postfix.

    ^ Exponentiation (** may also be used, and **= for the assignment operator).

    + - !Unary plus, unary minus, and logical negation.

    * / %Multiplication, division, and modulus.

    + - Addition and subtraction.

    spaceString concatenation.

    | |& Piped I/O for getline, print, and printf.

    < >
    <= >=
    != ==The regular relational operators.

    ~ !~ Regular expression match, negated match. NOTE: Do not use a constant regular expression
    (/foo/) on the left-hand side of a ~ or !~. Only use one on the right-hand side. The
    expression /foo/ ~ exp has the same meaning as (($0 ~ /foo/) ~ exp). This is usually not
    what was intended.

    in Array membership.

    && Logical AND.

    || Logical OR.

    ?: The C conditional expression. This has the form expr1 ? expr2 : expr3. If expr1 is true,
    the value of the expression is expr2, otherwise it is expr3. Only one of expr2 and expr3 is
    evaluated.

    = += -=
    *= /= %= ^= Assignment. Both absolute assignment (var = value) and operator-assignment (the other forms)
    are supported.

    Control Statements

    AWK的逻辑控制语句
    The control statements are as follows:

    if (condition) statement [ else statement ]
    while (condition) statement
    do statement while (condition)
    for (expr1; expr2; expr3) statement
    for (var in array) statement
    break
    continue
    delete array[index]
    delete array
    exit [ expression ]
    { statements }

    输入输出语句

    I/O Statements

    The input/output statements

    常用语句
    getline
    next
    awk中next的用法
    http://blog.chinaunix.net/uid-7685522-id-2045805.html
    print
    printf
    printf语句用法
    close

    内置函数
    算术函数

    字符串函数

    一般函数

    时间函数


    END{附在最后,awk的一些资料,其中有些已经贴在文中,这里来一个汇总吧
    awk的-F分隔符问题
    http://bbs.chinaunix.net/thread-4262179-1-1.html
    shell编程大赛
    http://bbs.chinaunix.net/thread-2319120-1-1.html
    awk初学之常见问题
    http://bbs.chinaunix.net/thread-2309494-1-1.html
    awk中next的用法
    http://blog.chinaunix.net/uid-7685522-id-2045805.html
    RS、ORS、FS、OFS相关问题
    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1354674&page=1
    awk数组学习心得
    http://blog.chinaunix.net/uid-2598756-id-293231.html
    FNR=NR问题
    http://bbs.chinaunix.net/thread-4084132-1-1.html
    参考的命令awk
    http://man.linuxde.net/awk
    }

    PS:

    其实好多内容别人都已经整理过,但自己整理的才是自己的,回头看看自己的这篇,就是一篇man awk的谷歌翻译

    顶多夹杂着自己的一些资料,理解,微乎其微。

      但胜过不去思考,人生不是在思考中进步的吗?

  • 相关阅读:
    二叉树
    队列和栈
    时间复杂度和空间复杂度
    二分查找法
    排序算法值归并排序
    排序算法之选择排序类
    5.7.1.3 Global 对象的属性
    5.7.1.2 eval() 方法
    5.7.1.1 单体内置对象
    5.6.3.8 fromCharCode()方法
  • 原文地址:https://www.cnblogs.com/irockcode/p/7044742.html
Copyright © 2011-2022 走看看