2012-02-16 50 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