0

我有一个像这样的文件

开始---abcxyz

结束----efg123

编号----2345

松弛---- lmnop

..... ......并且上述格式在“开始和松弛”之间的其他内容中重复

我想从文件中提取“开始”“结束”“Slack”的行那么我们如何在 unix 或使用 AWK 中做。

-谢谢

4

2 回答 2

7

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


如果你想要和之间的线(例如 ),你可以使用“回声”变量: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 }
    '

输出是:

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

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

然后,当awk看到以 开头的行时End,它将回显标志设置回 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
于 2012-07-26T00:49:56.160 回答
1

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

输入文件

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
于 2012-07-26T04:56:28.700 回答