2013-11-12 2 views
1

Мне нужно найти зашифрованные сообщения pgp в файле. Они начинаются с -----BEGIN PGP MESSAGE----- и заканчиваются -----END PGP MESSAGE-----.Как искать многострочный шаблон в тексте и получать последнее вхождение?

До сих пор у меня есть это:

$ tail -200 somefile | awk '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/' 

Это найти все вхождения, но я только хочу последний.

ответ

2

Вы можете использовать СЭД:

tail -200 somefile | sed -n ' 
    # only consider lines between BEGIN and END 
    /-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/ { 
    # if the beginning line, clear the hold space 
    /-----BEGIN PGP MESSAGE-----/{x;d} 
    # add the line to the hold space 
    H 
    }; 
    # print the hold space at the end 
    ${x;p}' 

Этот патч в комментарий (комментарии являются для объяснения и не нужны в реальной команде), любые линии между «BEGIN» и «END» будет добавляется в пространство удержания, при этом пространство удержания очищается на каждом «BEGIN», а затем печатается в конце.

EDIT:

Для полноты здесь есть версия без комментариев и на одной строке (делает то же самое, что и выше)

tail -200 somefile | sed -n '/-----BEGIN PGP MESSAGE-----/,/-----END PGP MESSAGE-----/{/-----BEGIN PGP MESSAGE-----/{x;d};H};${x;p}' 
2
awk ' 
/-----BEGIN PGP MESSAGE-----/ { 
    inBlock = 1 
    block = "" 
} 
inBlock { 
    block = block $0 ORS 
    if (/-----END PGP MESSAGE-----/) { 
     inBlock = 0 
    } 
} 
END { 
    printf "%s", block 
} 
' somefile 
1
BEGIN { 
    beginmsg = "-----BEGIN PGP MESSAGE-----" 
    endmsg = "-----END PGP MESSAGE-----" 
} 

$0 ~ beginmsg { 
    block = "" 
} 

beginmsg,endmsg { 
    block = block $0 ORS 
} 

END { 
    printf "%s", block 
} 
Смежные вопросы