如何使用awk
分隔符,其中包含多值:“#@ $”
我有这样的文件:Test1#@ $ Test2#@ $ Test3#@ $ Test4
我需要提取“ Test2”。
执行以下命令后:awk -F "#@$" '{print $2}'
,什么也不显示>
然后awk -F "#@$" '{print $1}'
我得到了完整的一行
有什么想法吗?
答案 0 :(得分:1)
您遇到的问题是字段分隔符FS
被视为正则表达式。 $
)在正则表达式中具有特殊含义,因为它表示行尾的锚点。解决方法是对它两次转义,因为
awk -F '#@\\$' '{print $1}'
扩展的正则表达式可以通过将包含表达式的字符串直接分配给内置变量
FS
或通过使用{{ 1}} sepstring选项。-F
变量的默认值应为单个。以下描述了 FS
的行为:
- 如果
FS
为空字符串,则行为未指定。如果
FS
是单个字符:
- 如果
FS
是,则跳过前导和尾随 和 字符;字段应由一组一个或多个 或 字符定界。 - 否则,如果
FS
是任何其他字符FS
,则字段每次出现c
时都应定界。否则,
c
的字符串值应被视为扩展的正则表达式。每次出现与扩展正则表达式匹配的序列都应定界字段。
括号表达式之外的
( FS
)应将表达式或子表达式的锚定到字符串的末尾;这样的表达式或子表达式只能匹配以字符串的最后一个字符结尾的序列。例如,ERE$
和ef$
与字符串(ef$)
中的ef
匹配,但与字符串abcdef
和ERE {{1 }}有效,但由于cdefab
阻止表达式e$f
匹配到最后一个字符而终止,因此无法匹配。
答案 1 :(得分:1)
只需将$括在方括号[]中即可删除其特殊含义
> cat t1
Test1#@$Test2#@$Test3#@$Test4
> awk -F '#@[$]' '{print $2}' t1
Test2
>