我有一个像这样的文件
开始---abcxyz
结束----efg123
编号----2345
松弛---- lmnop
..... ......并且上述格式在“开始和松弛”之间的其他内容中重复
我想从文件中提取“开始”“结束”“Slack”的行那么我们如何在 unix 或使用 AWK 中做。
-谢谢
我可以用两种不同的方式阅读这个问题,要么在两个标记之间回显线条,要么只输出多种类型的线条。
如果你想要和之间的线(例如 ),你可以使用“回声”变量:Start
End
awk
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
据我了解你的问题......你可以试试这个
输入文件
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