0

强调文字我有一些文字

CreateMainPageLink("410",$objUserData,$mnt[139]);

我想从中提取139出现mntwith后的数字gawk。我尝试了以下表达式(在pipe用于 a 结果的表达式中grep

gawk '{FS="[\[\]]";print NF}'

打印字段数。如果我的字段分隔符是[并且]我希望看到3打印出来的数字(三个字段;一个在左方括号之前,一个在之后,以及我要提取的实际数字)。我得到的是一个字段,对应于整行,以及两个警告:

gawk: warning: escape sequence `\[' treated as plain `['
gawk: warning: escape sequence `\]' treated as plain `]'

我按照此处给出的示例进行操作,但显然我的表达方式存在一些问题/错误。

使用以下两个表达式也不起作用:

gawk '{FS="[]"}{print NF;}'
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/

gawk '{FS="\[\]"}{print NF;}'
gawk: warning: escape sequence `\[' treated as plain `['
gawk: warning: escape sequence `\]' treated as plain `]'
gawk: (FILENAME=- FNR=1) fatal: Unmatched [ or [^: /[]/
4

3 回答 3

1

gawk -F[][] '{ 打印 $0" -> "$1"\t"$2; }'

$ gawk -F[][] '{ print $0" -> "$1"\t"$2; }'
titi[toto]tutu
titi[toto]tutu -> titi  toto

1)您必须FS在进入主解析循环之前设置。你可以这样做:

awk  'BEGIN { FS="[\\[\\]]"; } { print $0" -> "$1"\t"$2; }'

BEGIN在解析文件之前执行子句。

我必须对[字符进行两次转义:一次是因为它在带引号的字符串中。还有一次,因为 gawk 在括号表达式中强制要求它。

我个人更喜欢使用-F不太冗长的标志。

2)FS="[\[\]]"是错误的,因为你在一个带引号的字符串里面,这转义了字符串里面的字符。awk 会看到:[[]]这是一个无效的括号表达式。

3)FS="[]"是错误的,因为它是一个空括号表达式,试图不匹配任何内容

4)FS="\[\]"又错了,因为它是错误 2) 和 3) 一起:)

gawk 手册说:The regular expressions in awk are a superset of the POSIX specification。这就是为什么您可以使用:[\\[\\]][][]. 后者是posix方式。

要在列表中包含文字 ']',请将其设为第一个字符

看:

于 2013-09-24T12:51:24.350 回答
1

FS="[]"在这里它在里面寻找数据[],但没有。

要使用方括号,您需要像这样编写它们[][]

这也是错误gawk '{FS="[\[\]]";print NF}'的,您需要 FS 作为表达式外部的变量。

埃克斯

echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | awk -F[][] '{print $2}'
139

或者

awk  '{print $2}' FS=[][]

或者

awk 'BEGIN {FS="[][]"} {print $2}'

都给139

编辑:gawk '{FS="[\[\]]";print NF}'在这里您打印字段数NF而不是它的值$NF。无论如何,这无济于事,因为将您的数据与[]上次);提交的数据分开,所以使用它awk '{print $(NF-1)}' FS=[][]来获得倒数第二次提交。

于 2013-09-24T13:05:35.543 回答
0

你需要awk吗?您可以通过sed以下方式获取值:

 # echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | sed -n 's:.*\[\([0-9]\+\)\].*:\1:p'
 139
于 2013-09-24T12:48:37.743 回答