簡體   English   中英

使用awk或sed查找特定模式並打印完整文本塊

[英]Find specific pattern and print complete text block using awk or sed

如何在文本塊中找到特定數字並打印以關鍵字"BEGIN"開頭並以"END"結尾的完整文本塊? 基本上這是我的文件的樣子:

BEGIN
A: abc
B: 12345
C: def
END

BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END

[...]

如果我正在尋找'^B: 567' ,我想得到這個輸出:

BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END

我可以在這里使用grep( grep -E -B2 -A2 "^B: 567" file ),但我想得到一個更通用的解決方案。 我想awksed可能會這樣做!?

謝謝! :)

$ awk -v RS= -v ORS='\n\n' '/\nB: 567/' file
BEGIN
A: xyz
B: 56789
C: abc
END

BEGIN
A: ghi
B: 56712
C: pqr
END

注意B之前的\\n以確保它出現在一行的開頭。這取代了你原來的^ start-of-string字符,因為現在每一行都不是它自己的字符串。 您需要在上面設置ORS以重新插入記錄之間的空白行。

這可能適合你(GNU sed):

sed -n '/^BEGIN/{x;d};H;/^END/{x;s/^B: 567/&/mp}' file

或這個:

sed -n '/^BEGIN/!b;:a;$!{N;/\nEND/!ba};/\nB: 567/p' file

您可以取消RS以在空行中分割記錄並檢查字符串是否在整個塊中匹配:

awk 'BEGIN { RS = "" } /\nB:[[:space:]]+567/ { print $0 ORS }' infile

它產生:

BEGIN
A: xyz
B: 56789
C: abc
END 

BEGIN
A: ghi
B: 56712
C: pqr
END

這awk應該工作:

awk -v s='B: 567' '$0~s' RS= file
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END

有點長,但RS技巧已經發布:-)

BEGIN {found=0;start=0;i=0}


/BEGIN/ {
    start=1
    delete a
}

/.*567.*/ {found=1}

{
    if (start==1) {
        a[i++]=$0
    }
}

/END/ {
    if (found) {
        for (i in a)
            print a[i]
    }
    found=0
    start=0
    delete a
}

輸出:

$ awk -f s.awk input
BEGIN
A: xyz
B: 56789
C: abc
END
BEGIN
A: ghi
B: 56712
C: pqr
END
perl -lne 'if(/56789/){$f=1}
           push @a,$_;
           if(/END/){
              if($f){print join "\n",@a}
           undef @a;$f=0}' your_file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM