返回两点之间的特定值

时间:2017-02-24 20:22:48

标签: bash awk grep

我有许多大型数据文件,想要从整个文件中选择某些结果。该文件提供了不同参数的数据,即:

Number value 123
Option1 value parameter parameter
Option2 value parameter parameter
Option3 value parameter parameter
Number value 456
Option1 value2 parameter2 parameter2
Option2 value2 parameter2 parameter2
Option3 value2 parameter2 parameter2
Number value 789
Option1 value3 parameter3 parameter3
Option2 value3 parameter3 parameter3
Option3 value3 parameter3 parameter3

例如,如果我想记录Option2行,但只记录Number值123和Number值456(粗体 1)之间的那个,我该怎么办?我试过grep,但我认为它可能需要awk或其中一些变化?

由于

3 个答案:

答案 0 :(得分:3)

尝试:

awk '/Number value 123/,/Number value 456/{if ($0 ~ /Option2/){print}}' file

还要打印下面的一行(在评论中提问):

awk '/Number value 123/,/Number value 456/{if ($0 ~ /Option2/){print;getline;print}}' file

<强>解释

/Number value 123/,/Number value 456/:将获得两种模式之间的行范围。

实施例

$ awk '/Number value 123/,/Number value 456/' file
Number value 123
Option1 value parameter parameter
Option2 value parameter parameter
Option3 value parameter parameter
Number value 456

if ($0 ~ /Option2/){print;getline;print}:如果我们的模式对记录$0 ~ /Option2/进行数学计算,则打印,然后getline将获取下一条记录$0)将被下一个print抛给输出。

实施例

$ awk '/Number value 123/,/Number value 456/{if ($0 ~ /Option2/){print;getline;print}}' file
Option2 value parameter parameter
Option3 value parameter parameter 

答案 1 :(得分:3)

您可以使用datatalkingsed

grep

sed -n '/Number value 123/,/Number value 456/p' <fileName> | grep 'Option2' sed -n '/x/,/y/p'x之间打印文件部分,然后您可以使用y进行搜索。

答案 2 :(得分:1)

sed不需要grep:

sed -n '/Number value 123/,/Number value 456/{/Option2/p}' file

如果您知道数据是按设定顺序,则替换awk:

awk '/Number value (123|456)/{a=!a}a && /Option2/' file