如何在 AWK 中使用正则表达式作为字段分隔符?

mbi*_*ras 3 regex unix bash awk

我读到另一个答案,它展示了如何使用-F标志设置字段分隔符:

awk -F 'INFORMATION DATA ' '{print $2}' t
Run Code Online (Sandbox Code Playgroud)

现在我很好奇如何使用正则表达式作为字段分隔符。我的尝试如下所示:

$ echo "1 2 foo\n2 3 bar\n42 2 baz"
1 2 foo
2 3 bar
42 2 baz
$ echo "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '\d+ \d+ ' '{ print $2 }'
# 3 blank lines
Run Code Online (Sandbox Code Playgroud)

我期望得到以下输出:

foo
bar
baz 
Run Code Online (Sandbox Code Playgroud)

这是因为我的正则表达式\d+ \d+匹配“前两个数字由空格分隔,后跟空格”。但我正在打印第二条记录。如红宝石所示:

在此输入图像描述

  • 如何使用正则表达式作为 awk 字段分隔符?

Val*_*tin 7

首先,echo不会自动转义并输出文字\n。因此,您需要添加-e以启用转义。其次awk不支持\d,所以你必须使用[0-9]or [[:digit:]]

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[0-9]+ [0-9]+ ' '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

或者

echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[[:digit:]]+ [[:digit:]]+ ' '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

两个输出:

foo
bar
baz 
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,某些版本的 echo 会在给定“\n”的情况下打印文字换行符。这是最好避免使用 echo 的原因之一 - 它的行为是不可移植的。使用“printf”代替。 (2认同)