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


16

我正在尝试使用regex作为中的字段分隔符awk。从我的阅读看来,这似乎是可行的,但我无法正确理解语法。

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

有什么想法吗?目的(如果不是很明显)是获得没有版本号的软件列表。

Answers:


25

您已经弄乱了引号和语法。要设置输入字段分隔符,最简单的方法是使用-F命令行上的选项:

awk -F '[0-9]' '{ print $1 }'

要么

awk -F '[[:digit:]]' '{ print $1 }'

这将使用任何数字作为输入字段分隔符,然后从每行输出第一个字段。

[0-9][[:digit:]]表达式不相当,同样根据您所在地区。请参见“ [0-9],[[:digit:]]和\ d之间的区别 ”。

也可以FSawk程序本身中设置。由于这是BEGIN一次初始化,因此通常在一个块中完成:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

请注意,在外壳程序中不能在单引号引起来的字符串中使用单引号,并且awk字符串始终使用双引号。


12

+1为Kusalananda的答案。另外,可以在BEGIN块中设置FS变量:

awk 'BEGIN {FS="[0-9]"} {print $1}'

在读取下一行之前,在动作块中更改FS不会生效

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

问题中的其他错误:

  • 不能在单引号中使用单引号
  • ==是比较运算符,=用于变量赋值

1
“在读取下一行之前,在动作块中更改FS不会生效”,我一直到处寻找该信息。
Samizdis

1
加号:即使您从外壳正确传递了字符串,也无法在awk中使用单引号作为字符串值
dave_thompson_085
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.