2016-04-21 45 views
1

我有困難從文本文件中抓幾行。例如說我有一個文件中的以下文字:如何grep/sed/awk,並獲得下幾行,直到某種模式

A I have a cat 
B I have a dog 
C I have a mouse 
X I have a monkey 
B I have a rat 
T I have a cat 
C I have a deer 
X I have a turkey 

我試圖找到包含單詞「貓」,如果句中有一個「A」的第一個字母,我所有的行喜歡獲取接下來的幾行(包括匹配模式「cat」的行),直到遇到字母「X」作爲行的第一個字母。

因此,舉例來說,上面的文字文件應該打印出來:

A I have a cat 
B I have a dog 
C I have a mouse 

(打印出來,直到它看到的X)

注:該生產線「TI有一隻貓」不應該匹配,因爲即使它有貓它不以字母「A」開頭

我試圖尋找幫助,但找不到任何東西打印出行,直到某種模式匹配。我能找到的最接近的是

awk '/cat/ {for(i=0; i<=5; i++) {getline; print}}' filename

但打印出若干行的。我希望它打印出來,直到它看到下一個模式這是一個 「X」

+0

如果您曾經在考慮使用getline,那麼請閱讀http://awk.info/?tip/getline,這樣您就能理解爲什麼這幾乎總是錯誤的方法,以及如何在極少數情況下強有力地實現它,當它是正確的做法。 –

+1

感謝提示@EdMorton –

回答

1
$ awk '/^X/{f=0} /^A.*cat/{f=1} f' file 
A I have a cat 
B I have a dog 
C I have a mouse 
+1

驚人的!謝謝:) –

+0

不客氣。您可能還對http://stackoverflow.com/a/18409469/1745001感興趣。 –

1

使用sed,而不是awk

$ sed -n '/^A.* cat/,/^X/{/^X/d;p;}' data 
A I have a cat 
B I have a dog 
C I have a mouse 
$ 
  • -n - 默認不打印,
  • /^A.* cat/ - 從A開始幷包含cat後的一個空格(調整爲適應cat的定義;它會拾取A I visited the catacombs,例如),
  • /^X/ - 高達開始X一條線,
  • {/^X/d; - 刪除起始X任何線(唯一的線),並移動到處理下一行,
  • p;} - 打印行。

如圖所示,它將與BSD sed和GNU sed一起工作; GNU sed不需要最後的分號。

+0

這裏是另一個sed的方式來選擇打印:'sed -n'/^A.*cat/,/^X/{/^X/!p}'file' – 2016-04-21 18:11:13

相關問題