使用awk在模式之间提取线

时间:2017-12-09 11:27:40

标签: awk

我正在尝试使用awk来提取两种模式之间的行,但由于第二种模式涉及多个$$$$符号,我无法正确保护$

输入是:

Name1
iii
iii
$$$$

Name2
ii
ooo
ppp
$$$$

Name3
pp
oo
ii
uu
$$$$

期望的输出

Name2
ii
ooo
ppp
$$$$

我试过这样的事情:

awk 'BEGIN {RS="\\$\\$\\$\\$\n"; FS="\n"} $1==Name2 {print $0; print "$$$$"}' inputfile

我也试过像

这样的东西
awk '/^Name2/,/\\$\\$\\$\\$\\/' input

我尝试了许多不同的$保护,但我做错了,要么没有打印,要么打印整个文件

非常感谢您的建议

3 个答案:

答案 0 :(得分:2)

如果您正在寻找文字匹配

,则不必使用模式
awk '$0=="Name2",$0=="$$$$"' file

将提取两个文字之间的行。如果第一场比赛是模式,则为组合

awk '/Name2/,$0=="$$$$"' file

答案 1 :(得分:1)

Awk 解决方案:

awk '/^Name2/{ f=1 }f; $1=="$$$$"{ f=0 }' file
  • f变量是一个标记,表示打印当前行的可能性

输出:

Name2
ii
ooo
ppp
$$$$

答案 2 :(得分:1)

您可以使用双空行,而不是使用$$$$作为记录分隔符,这意味着分成段落

awk 'BEGIN{RS=""}/Name2/' file

RS=""是一个特殊值。从awk手册页:

  

如果RS设置为空字符串,则记录由空行分隔。当RS设置为空字符串时,换行符始终作为          除了FS可能具有的任何值之外,还有字段分隔符。

虽然上面的代码适用于您的示例,但在有Name20等密钥时会遇到麻烦。意味着正则表达式匹配可能不是正确的方法。字符串比较可能是更好的套件:

awk 'BEGIN{RS="";FS="\n"} $1 == "Name2"' file

我明确设置FS="\n"以避免在单行内拆分。