使用多个定界符时清空第一个字段

Empty first field when using multiple delimiters

我正在尝试解析程序的输出,它是这样给出的:

  Status       : OK (97 ms)

这些都是空格,没有制表符。我不知道这个间距是否会在不同版本中保持一致,所以我想将空格 冒号视为分隔符。

我很清楚字段分隔符可以声明为任意复杂的正则表达式,所以我希望这会起作用:

echo "  Status       : OK (97 ms)" | awk -F'[ :]+' '/Status/{print }'

但事实并非如此;相反,它打印 "Status",而 </code> 是一个空字符串。</p> <p>将此与内置分隔符的输出进行比较,其中前导分隔符似乎被忽略并且 <code> 是 "Status":

echo "  Status       : OK (97 ms)" | awk '/Status/{print }'

打印 很容易,但这让我想知道我做错了什么,或者误解了什么?

我正在使用 GNU Awk 3.1.7

因为在示例输入中,字段分隔符在 Status 之前,第一个字段为空,第二个字段为 Status。观察:

$ echo "  Status       : OK (97 ms)" | awk -F'[ :]+' '/Status/{print }'
Status
$ echo "Status       : OK (97 ms)" | awk -F'[ :]+' '/Status/{print }'
OK

一个选项是将:(作为字段分隔符,在这种情况下,第二个字段将包含</code>,无论是否有前导space:</p> <pre><code>$ echo " Status : OK (97 ms)" | awk -F'[:(]+' '/Status/{print }' OK $ echo "Status : OK (97 ms)" | awk -F'[:(]+' '/Status/{print }' OK

另一种选择是保留字段分隔符,但在打印前删除前导 space:

$ echo "  Status       : OK (97 ms)" | awk -F'[ :]+' '{sub(/^ +/,"")} /Status/{print }'
OK
$ echo "Status       : OK (97 ms)" | awk -F'[ :]+' '{sub(/^ +/,"")} /Status/{print }'
OK

Awk 和前导或尾随字段分隔符

对于默认的字段分隔符,忽略前导和尾随空白。如果使用自定义字段分隔符,前导和尾随分隔符 not 将被忽略。这记录在 POSIX standard:

  1. If FS is a null string, the behavior is unspecified.

  2. If FS is a single character:

    a. If FS is <space>, skip leading and trailing <blank> and <newline> characters; fields shall be delimited by sets of one or more <blank> or <newline> characters.

    b. Otherwise, if FS is any other character c, fields shall be delimited by each single occurrence of c.

  3. Otherwise, the string value of FS shall be considered to be an extended regular expression. Each occurrence of a sequence matching the extended regular expression shall delimit fields.

根据您对字段分隔符的定义,这就是字段解析的内容。为了更好地形象化,让我们用逗号

替换字段分隔符
$ awk '{gsub(/[ :]+/,",")}1' file

,Status,OK,(97,ms)

现在很清楚 "Status" 是字段 2。