Linux awk的默认字段分隔符

Linux awk的默认字段分隔符,linux,unix,awk,posix,separator,Linux,Unix,Awk,Posix,Separator,很抱歉这个愚蠢的问题,搜索过但没有把握找到了正确的答案,因此默认分隔符仅为awk的空格?让我们看看GNU awk手册页: FS-输入字段分隔符,默认为空格。见上文字段 到田野区去 读取每个输入记录时,gawk使用FS变量的值作为字段分隔符,将记录拆分为字段。如果FS是单个字符,则字段由该字符分隔。如果FS为空字符串,则每个字符将成为一个单独的字段。否则,FS应该是一个完整的正则表达式。在FS是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。 问题默认分隔符仅为awk的空格?不明确,

很抱歉这个愚蠢的问题,搜索过但没有把握找到了正确的答案,因此默认分隔符仅为awk的空格?

让我们看看GNU awk手册页:

FS
-输入字段分隔符,默认为空格。见上文字段

到田野区去

读取每个输入记录时,gawk使用
FS
变量的值作为字段分隔符,将记录拆分为字段。如果
FS
是单个字符,则字段由该字符分隔。如果
FS
为空字符串,则每个字符将成为一个单独的字段。否则,
FS
应该是一个完整的正则表达式。在
FS
是单个空格的特殊情况下,字段由空格和/或制表符和/或换行符分隔。


问题
默认分隔符仅为awk的空格?
不明确,但我将尝试回答您可能提出的两个问题

FS
变量的默认值(包含字段分隔符,告诉awk在读取记录时如何将记录分隔为字段)是一个空格字符

awk用于将记录分隔为字段的是“字段分隔符”,它是一个正则表达式,具有一些附加功能,仅当字段分隔符为单个空白字符时才适用。该附加功能是:

  • 在字段拆分期间,将忽略前导和尾随空格
  • 字段以连续的空格字符链分隔,其中包括空格、制表符和换行符
  • 如果要使用文本空白字符作为字段分隔符,则必须将其指定为
    []
    ,而不是像在regexp中那样仅指定一个独立的文本空白字符
  • 除了在读取输入时用于将记录拆分为字段的字段分隔符外,它们还用于其他一些上下文中,例如
    split()
    的第三个参数,因此了解哪些上下文需要字符串、regexp或fieldsep非常重要,手册页清楚地指定了每个字段

    除其他事项外,上述内容解释了这一点:

    $ echo ' a b c ' | awk '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
    3: <a> <b> <c>
    $ echo ' a b c ' | awk -F' ' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'
    3: <a> <b> <c>
    $ echo ' a b c ' | awk -F'[ ]' '{printf "%d: <%s> <%s> <%s>\n", NF, $1, $2, $3}'                              
    5: <> <a> <b>
    
    $echo'abc'| awk'{printf“%d:\n”,NF,$1,$2,$3}
    三:
    $echo'abc'| awk-F'{printf“%d:\n”,NF$1,$2,$3}'
    三:
    $echo'abc'| awk-F'[]'{printf“%d:\n”,NF$1,$2,$3}'
    5:   
    

    因此,如果您不理解为什么前两个产生相同的输出,但最后一个不同,请询问。

    这里有一个适用于所有主要Awk实现的实用总结

    • GNU Awk(
      gawk
      )-某些Linux发行版中的默认值
      Awk
    • Mawk(
      Mawk
      )-一些Linux发行版中默认的
      awk
      (例如,Ubuntu的早期版本报告说,版本19.04现在带有GNU awk-见下面的评论。)
    • BSD Awk-也称BWK Awk-类似BSD的平台(包括OSX)上的默认
      Awk
    在Linux上,
    awk-W版本将告诉您默认的
    awk
    是哪个实现。
    BSD Awk只理解
    Awk--version
    (GNU Awk除了理解
    Awk-W version
    )之外还了解该版本

    所有这些实现的最新版本都遵循与字段分隔符相关的规则(但不包括记录分隔符)

    词汇表:

    • RS
      输入记录分隔符,它描述了如何将输入分解为记录

      • POSIX强制默认值是一个换行符,下面也称为
        \n
        ;也就是说,输入在默认情况下被分成几行
      • awk
        的命令行上,
        RS
        可以指定为
        -vrs=
      • POSIX将
        RS
        限制为一个文本、单字符值,但GNU Awk和Mawk支持可以是扩展正则表达式的多字符值(BSD Awk不支持)
    • FS
      输入字段分隔符,它描述了如何将每条记录拆分为字段;它可能是一个扩展的正则表达式

      • awk
        的命令行上,
        FS
        可以指定为
        -F
        (或
        -vfs=
      • 形式上是一个空格(
        0x20
        ),但该空格不是字面意义上的(唯一)分隔符,而是具有特殊含义
        ;见下文

    默认情况下

    • 任何空格和/或选项卡和/或换行符的运行都被视为字段分隔符
    • 忽略了前导和尾随运行
    POSIX规范,适用于所有语言环境,但可能包含特定语言环境中的其他字符-我不知道是否存在任何此类语言环境

    请注意,使用默认输入记录分隔符(
    RS
    ),
    \n
    换行符通常不作为字段分隔符输入图片,因为在这种情况下,没有记录本身包含
    \n

    新行作为字段分隔符确实起作用,但是:

    • RS
      设置为一个值,该值导致记录本身包含
      \n
      实例时(例如
      RS
      设置为空字符串时;请参见下文)
    • 通常,当使用
      split()
      函数将字符串拆分为数组元素时,没有显式的字段分隔符参数。
      • 即使输入记录