我有一个像这样的文件
开始--- abcxyz
结束---- efg123
参考---- 2345
Slack ---- lmnop
..... ...... 并且上面的格式与“Start& Slack”之间的其他内容重复。
我想从“开始”“结束”“松弛”文件的grep行 那么我们怎样才能在unix或使用AWK。
-thanks
答案 0 :(得分:7)
我可以用两种不同的方式阅读这个问题,要么回显两个标记之间的线条,要么只输出多种类型的线条。
如果您希望 Start
和End
之间的行(例如),则可以将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