extração de sub-string bash para o caractere inicial e final especificado

7

Por exemplo, eu tenho um arquivo de log com esta entrada:

[Wed Aug 08 11:39:41 2012] [error] [client 155.94.70.224] ModSecurity: [file "/etc/httpd/modsecurity.d/rules/base_rules/modsecurity_crs_20_protocol_violations.conf"] [line "271"] [id "960020"] [rev "2.2.5"] [msg "Pragma Header requires Cache-Control Header for HTTP/1.1 requests."] [severity "NOTICE"] [tag "RULE_MATURITY/5"] [tag "RULE_ACCURACY/7"] [tag "https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"] [tag "PROTOCOL_VIOLATION/INVALID_HREQ"] [tag "http://www.bad-behavior.ioerror.us/documentation/how-it-works/"] Warning. String match "HTTP/1.1" at REQUEST_PROTOCOL. [hostname "webmail.white-art.co.uk"] [uri "/horde/themes/graphics/tree/plusonly.png"] [unique_id "UCJB7VveCGYAAG@BHJgAAAAQ"]

Eu quero extrair todos os pares de strings começando com o caractere [ e terminando com ] . Eu posso usar cut ou awk para extrair usando um único delimitador, mas eu preciso extrair uma string entre iniciar [ e terminar ] . como fazer isso?

Por exemplo, preciso extrair:

"[tag "RULE_ACCURACY/7"]"

e

"[severity "NOTICE"]"

do log.

Eu encontrei uma solução que primeiro tenho que explodir o log adicionando uma nova linha após cada ] e depois usando o grep para procurar por uma string obrigatória. Existe alguma maneira melhor de fazer isso?

    
por Farhan 08.08.2012 / 12:44

2 respostas

10

Acho que isso vai dividir a linha como você quer

sed -e 's/\]/\]\n/g' log | sed -e 's/^ *//g' | awk '/^\[/ {print}'

Primeiro, insira uma nova linha após cada ] , depois remova os espaços iniciais e, finalmente, imprima as linhas que começam com [ .

Sua linha de entrada se torna

[Wed Aug 08 11:39:41 2012]
[error]
[client 155.94.70.224]
[line "271"]
[id "960020"]
[rev "2.2.5"]
[msg "Pragma Header requires Cache-Control Header for HTTP/1.1 requests."]
[severity "NOTICE"]
[tag "RULE_MATURITY/5"]
[tag "RULE_ACCURACY/7"]
[tag "https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"]
[tag "PROTOCOL_VIOLATION/INVALID_HREQ"]
[tag "http://www.bad-behavior.ioerror.us/documentation/how-it-works/"]
[uri "/horde/themes/graphics/tree/plusonly.png"]
[unique_id "UCJB7VveCGYAAG@BHJgAAAAQ"]
    
por 08.08.2012 / 12:57
9

Esse comando fará o que você quiser:

grep -o '\[[^]]*\]' inputfile
    
por 08.08.2012 / 19:11

Tags