AWK:如何提取某个字段中两个逗号之间的单词

AWK:如何提取某个字段中两个逗号之间的单词,awk,Awk,我有一个文件如下所示: name.com,168fcade-fc3d-425e-b67d-7176c80122f6,system,1034567,Red Hat Enterprise Linux Server, Standard (Physical or Virtual Nodes), 我需要提取以Red Hat开头的2个逗号之间的部分,或者仅提取红色,以便我的输出为: Red Hat Enterprise Linux Server 我已经尝试过了,但没有成功 awk 'match($0,/

我有一个文件如下所示:

name.com,168fcade-fc3d-425e-b67d-7176c80122f6,system,1034567,Red Hat Enterprise Linux Server, Standard (Physical or Virtual Nodes),
我需要提取以Red Hat开头的2个逗号之间的部分,或者仅提取红色,以便我的输出为:

Red Hat Enterprise Linux Server
我已经尝试过了,但没有成功

awk 'match($0,/,[^Red]*,/) {print substr($0,RSTART+1,RLENGTH-2)}' file
这将打印我想要的数据之前字段中逗号之间的数据

1034567
我想我错过了一些简单的东西,但我想不出来

awk -F, '{print $5}' file
另外,请注意,当您编写时:

match($0,/,[^Red]*,/)
您指定了一个括号表达式(
[…]
),其中有一个被否定的(
^
)字符列表(
Red
=
R
e
d
)重复了零次或多次。因此,regexp正在查找除R、e或d以外的任何字符。它不是在寻找与字符串“Red”相关的任何东西,我认为这是您试图传达的内容。我怀疑你是想写这个:

$ awk 'match($0,/,Red[^,]+,/) { print substr($0,RSTART+1,RLENGTH-2) }' file
Red Hat Enterprise Linux Server
另外,请注意,当您编写时:

match($0,/,[^Red]*,/)
您指定了一个括号表达式(
[…]
),其中有一个被否定的(
^
)字符列表(
Red
=
R
e
d
)重复了零次或多次。因此,regexp正在查找除R、e或d以外的任何字符。它不是在寻找与字符串“Red”相关的任何东西,我认为这是您试图传达的内容。我怀疑你是想写这个:

$ awk 'match($0,/,Red[^,]+,/) { print substr($0,RSTART+1,RLENGTH-2) }' file
Red Hat Enterprise Linux Server

如果不知道职位,这也行

$ awk -v RS=, '/^Red/' file

Red Hat Enterprise Linux Server

如果不知道职位,这也行

$ awk -v RS=, '/^Red/' file

Red Hat Enterprise Linux Server

“Red Hat Enterprise Linux Server”是否总是在第4和第5个逗号之间?如果您不能简单地执行
awk-F,{print$5}文件
,那么请提供几行更具代表性的示例输入和预期输出。正是。。“awk-F,{printf(“%s”),$5}'文件”就足够了。。。然而,目标字符串必须始终在第4和第5个逗号之间,这是有效的Ed。我没有想到。是的,它将始终在第4和第5个逗号之间。红帽企业Linux服务器始终在第4和第5个逗号之间?如果你不能简单地执行
awk-F,{print$5}'文件
然后提供几行更具代表性的样本输入和预期输出。准确地说。。“awk-F,{printf(“%s”),$5}'文件”就足够了。。。但是,目标字符串必须始终在第4和第5个逗号之间,这是可行的Ed。我没有想到这一点。是的,它将始终在第4和第5个逗号之间,就像第一个简单的答案一样。在我的版本中,您更正了为什么必须移动胡萝卜并将其括在括号中?为什么你不能从括号中去掉红色而不否定它呢?像这样:awk-F,'match($0,/,^Red*,/){print substr($0,RSTART+1,RLENGTH-2)}文件您对regexp语法非常困惑
^
在括号表达式内表示“否定”,但在括号表达式外表示“字符串开头”。在ReXEP <代码>中使用,^……/<代码>没有意义,因为它不能与字符串中间的字符串的起始相匹配。与shell globbing不同,regexp中的
*
表示“零或多个”重复,因此
Red*,
表示字符串
Re
,然后是字符
d
的零或多个重复,然后是
以便只匹配
Re、
redddd等字符串,
但不包括
红帽
或任何类似物品。阅读regexp教程,stat;-)。很好的解释。我将尽快学习正则表达式教程lol:)为了简单起见,我喜欢第一个答案。在我的版本中,您更正了为什么必须移动胡萝卜并将其括在括号中?为什么你不能从括号中去掉红色而不否定它呢?像这样:awk-F,'match($0,/,^Red*,/){print substr($0,RSTART+1,RLENGTH-2)}文件您对regexp语法非常困惑
^
在括号表达式内表示“否定”,但在括号表达式外表示“字符串开头”。在ReXEP <代码>中使用,^……/<代码>没有意义,因为它不能与字符串中间的字符串的起始相匹配。与shell globbing不同,regexp中的
*
表示“零或多个”重复,因此
Red*,
表示字符串
Re
,然后是字符
d
的零或多个重复,然后是
以便只匹配
Re、
redddd等字符串,
但不包括
红帽
或任何类似物品。阅读regexp教程,stat;-)。很好的解释。我将尽快学习正则表达式教程lol:)