如何在unix或AWK中执行以下grep操作

Jam*_*ond 0 unix linux vim bash awk

我有一个像这样的文件

开始--- abcxyz

结束---- efg123

参考---- 2345

Slack ---- lmnop

...... ......以及上面的格式与"Start&Slack"之间的其他内容重复

我想从文件中获取"开始""结束""松弛"的行,那么我们如何在unix中或使用AWK.

-谢谢

pax*_*blo 7

我可以用两种不同的方式阅读这个问题,要么回显两个标记之间的线,要么只输出多种类型的线.


如果你想要和(例如)之间 的线,你可以使用"echo"变量:StartEndawk

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | awk '
    /^Start / { e = 1 }
              { if (e) { print } }
    /^End /   { e = 0 }
    '
Run Code Online (Sandbox Code Playgroud)

输出是:

Start ---abcxyz
something goes here
and here
End ---- efg123
Run Code Online (Sandbox Code Playgroud)

echo变量e最初未设置,因此if语句永远不会触发.每当awk看到一行开头时Start,它都会将echo变量设置为true.在这种情况下,所有行都将从该点开始回显.

然后,当awk看到以...开头的行时End,它会将echo标志设置回false,从而阻止进一步输出.

三个awk命令的顺序可用于决定是否也打印起始行和结束行.例如,如果你不想要它们,你可以交换第一个和第三个命令(开始和结束命令):

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | awk '
    /^End /   { e = 0 }
              { if (e) { print } }
    /^Start / { e = 1 }
    '
Run Code Online (Sandbox Code Playgroud)

输出是:

something goes here
and here
Run Code Online (Sandbox Code Playgroud)

如果你只是想要开始,结束和松弛的线条,grep那么这样做非常简单:

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | egrep '^Start |^End |^Slack'
Run Code Online (Sandbox Code Playgroud)

输出是:

Start ---abcxyz
End ---- efg123
Slack---- lmnop
Run Code Online (Sandbox Code Playgroud)