2012-02-16 34 views
6

之间线路有人建议,如果我有一个像阅读两个关键字

*System_Power 
1 
1.2 
1.8 
2 
*System_Terminate 

在这种情况下,两个关键词之间的阅读做什么asnwer将

1 
1.2 
1.8 
2 

我试着用AWK像

awk '$0 =="*System_Power"    # start printing when 1st field is *System_Power 
$0 != "*System_Terminate"{    # until reach the *System_Terminate 
print; } ' powerSummary > reportedFailure.k # Read from file powerSummary and pipe to reportedFailure.k 
exit 

其中上述数据位于文件powerSummary中间的某处。

我会感谢您的更正。

回答

5

这会为你工作:

$ awk '/\*System_Power/{f=1;next}/\*System_Terminate/{f=0}f' infile 
1 
1.2 
1.8 
2 
+0

它为我工作,但我无法找到一个一般的行为方式。每次我都会得到一种很难消化的新解决方案。试图得到它。 – 2012-02-17 08:04:57

2

您可以使用sed到平凡选择两个匹配的行之间的文本,但是这也将包括匹配线本身......所以我们明确地删除那些:

sed -n '/System_Power/,/System_Terminate/ { 
    /^\*/ d 
    p 
}' < input 

awk还可以选择匹配线之间的文本:

awk '/System_Power/,/System_Terminate/ {print}' < input 

...但像sed这将包括开始/结束终止符。你可以用awk来解决这个问题,但我认为你可以用sed得到一个更清洁的解决方案。

+0

你有使用重定向而不是sed/awk参数的原因吗?对于我来说,那些可以写成'sed ... input'或'awk ... input'而没有'<'的。 – jfg956 2012-02-16 21:47:26

+0

不,没理由。只是在过滤器的心情。 – larsks 2012-02-16 22:00:15

1

这里的另一个问题:

awk '$1=="*System_Power",$1=="*System_Terminate" {if (!/System*/) print}' in.txt 
1

这可能会为你工作:

sed '/^\*System_Power/,/^\*System_Terminate/!d;//d' file 

或本:

awk '/^\*System_Terminate/{p=0};p;/^\*System_Power/{p=1}' file