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

时间:2012-07-26 00:45:31

标签: linux bash unix vim awk

我有一个像这样的文件

开始--- abcxyz

结束---- efg123

参考---- 2345

Slack ---- lmnop

..... ...... 并且上面的格式与“Start& Slack”之间的其他内容重复。

我想从“开始”“结束”“松弛”文件的grep行 那么我们怎样才能在unix或使用AWK。

-thanks

2 个答案:

答案 0 :(得分:7)

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


如果您希望 StartEnd之间的行(例如),则可以将awk与“echo”变量一起使用:

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

输出是:

Start ---abcxyz
something goes here
and here
End ---- efg123

最初未设置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 }
    '

输出是:

something goes here
and here

如果您只想要开始,结束和松弛的行,grep非常适合这样做:

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | egrep '^Start |^End |^Slack'

输出是:

Start ---abcxyz
End ---- efg123
Slack---- lmnop

答案 1 :(得分:1)

据我了解你的问题......你可以试试这个

<强> INPUTFILE

Start ---abcxyz

End ---- efg123

Ref ----2345

Slack---- lmnop

Some other text

Some other text

Some other text

Start ---osdidiu

End ---- llll

Ref ----234513

Slack---- lmnodsasdp

<强>代码

 awk '$1 == "Start" || $1 == "End" || $1 == "Slack----" {print $0}' InputFile

<强>输出

Start ---abcxyz
End ---- efg123
Slack---- lmnop
Start ---osdidiu
End ---- llll
Slack---- lmnodsasdp