使用awk或sed在页眉和页脚之间获取文本,但不包括页眉和页脚

时间:2018-02-28 20:29:08

标签: text awk sed grep

假设我有一个文件myfile.txt,其中包含以下内容:

1234
5678
start
stuff
stop
9871

我想在标题' start'之间获取数据。并且页脚停止'但包括这些边界(所以在这种情况下,我的结果只是行'东西')。使用awk和sed,我尝试了以下内容:

 awk '/start/ { show=1 } show; /stop/ { show=0 }' myfile.txt
 sed -n '/start/,/stop/p' myfile.txt

但这些包括输出中的页眉和页脚。 我怎么能这样做,以便我不保留标题和脚 - 但只有中间的信息?

3 个答案:

答案 0 :(得分:4)

只需颠倒测试顺序:

$ awk '/stop/{show=0} show; /start/ { show=1 }' myfile.txt
stuff

如何运作

  • /stop/{show=0}

    每当我们遇到与正则表达式stop匹配的行时,我们会将变量show设置为0(false)。

  • show;

    如果show为真,请打印该行。

    更详细地说,show是一个条件,意味着它被评估,如果是,则执行一个动作。由于我们没有明确指定操作,因此执行默认操作print $0

    由于未明确指定任何操作,因此我们需要将show;一起使用,以便将其与下一个命令分开。

  • /start/ { show=1 }

    只要我们遇到与正则表达式start匹配的行,我们就会将变量show设置为1(true)。

答案 1 :(得分:1)

使用gnu sed

sed '/start/,/stop/!d;//d' myfile.txt

答案 2 :(得分:1)

另一个sed命令,但也是gnu-sed:

echo "1234
5678
start
stuff
stop
9871" | sed -n '/start/,/stop/p' | sed '1d;$d' 
stuff

编程没有问题,用另一层sed无法解决。 :)