2017-07-16 100 views
0

我有一個類似於Bash, grep between two lines with specified string的情況。我有以下格式的輸出的文本文件:過濾文本文件的行

HEADER A 
lines of output 
---------------- 
HEADER B 
lines of output 
---------------- 
...rinse and repeat... 

我想匹配具有相同標頭的所有塊。 grep似乎不足以完成此任務。我只是模糊地熟悉awksed。足以認識到他們可能是這裏最合適的工具。那麼如何匹配一個由匹配的HEADER和----------行封閉的塊呢?

我的基於鏈接的問題,嘗試

awk '/HEADER/{f=1} /-/{f=0;print} f' filename.txt 

然而,這仍然符合一些與第二集塊線。

+0

也許你需要擴大你的輸入文件,並告訴你如何得到錯誤的輸出...... –

+0

@GeorgeVasiliou剛編輯顯示更清楚的文件格式。 –

+0

爲什麼不'awk'/ HEADER A/{f = 1}/-------/{f = 0; print} f'file.txt' ...? –

回答

1

調整this answer,以適應問題,我得到:

sed -n '/HEADER/,/-/p' filename.txt 

這是相當脆(它停止當它找到一個連字符),所以像

sed -n '/HEADER/,/^-+$/p' filename.txt 

檢查全連字符可能更可取。據我所知(不是sed專家),斜線之間的所有內容都是正則正則表達式,啓用了多行標誌m

+0

我的一點研究表明''x,y''語法匹配從'x'到'y'的多行,可以用正則表達式來指定。據我所知,每個正則表達式只匹配個別行。 –

+0

我已經遇到了你的第一個解決方案的脆弱性。帶有第二個標題的塊包含負數。 –

1

對於這樣一個文件:

$ cat file1 
HEADER A 
lines of output1.1 
---------------- 
HEADER B 
lines of output2.1 
---------------- 
HEADER A 
lines of output1.2 
---------------- 
HEADER B 
lines of output2.2 
---------------- 
HEADER A 
lines of output1.3 
---------------- 
HEADER B 
lines of output2.3 
---------------- 

像這樣的東西給所有頭一句臺詞:

$ awk '/HEADER A/{f=1} /-------/ && f==1{f=0;print} f' file1 
HEADER A 
lines of output1.1 
---------------- 
HEADER A 
lines of output1.2 
---------------- 
HEADER A 
lines of output1.3 
---------------- 

你只需要在終端線路

使一個AND條件(& &)

如果這不是你所需要的,恐怕你應該重新輸入你的問題,以便更清楚一點。

+0

你能解釋一下,在你的命令結尾處'f'的功能是什麼?如果'f'是1,那麼打印記錄,這是否正確? – FloHe

+1

@FloHe在'awk'世界中,最後一個'f'是一個awk快捷方式,用於說明'if f == 1 then print'(或者在awk代碼中'f == 1 {print $ 0}')。更確切地說,一個單一的f是一個條件檢查,相當於'如果f不是零或者f沒有被設置,那麼打印這條線'。此外,在awk中,我們可以在'condition {action}'的awk語法中省略'{action}'部分。完成該操作後,將執行默認操作=打印該行='{print $ 0}' –

+0

好的答案,謝謝 – FloHe