如何使用符号[和]作为gawk的字段分隔符?

时间:2013-09-24 12:34:19

标签: gawk

强调文字我有一些文字,如

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

我希望在139 mnt gawk之后从中提取数字pipe。我尝试了以下表达式(在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 [^: /[]/

我正在关注给定here的示例,但显然我的表达式存在一些问题/错误。

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

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 [^: /[]/

{{1}}

3 个答案:

答案 0 :(得分:1)

gawk -F [] []'{print $ 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方式。

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

见:

答案 1 :(得分:1)

FS="[]"此处查找[]内的数据,但没有。

要使用方括号,您需要像[][]

一样编写它们

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

EKS

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=[][]获取倒数第二个。

答案 2 :(得分:0)

您需要awk吗?您可以通过sed获取价值:

 # echo 'CreateMainPageLink("410",$objUserData,$mnt[139]);' | sed -n 's:.*\[\([0-9]\+\)\].*:\1:p'
 139