Curl e Grep para analisar o conteúdo

0

Eu preciso analisar a saída de um comando curl :

curl --user test:test http://192.168.1.1/security/pkm.html | egrep '@company|config.pkm.password'

Isso retorna:

<input type="text" id="config.pkm.dentity" name="config.pkm.identity" value="[email protected]" maxlength="64" />
<input type="text" id="config.pkm.inner_identity" name="config.pkm.inner_identity" value="[email protected]" maxlength="64" />
<input type="password" id="config.pkm.password" name="config.pkm.password" value="382738" maxlength="64" />

Eu quero pesquisar por name="config.pkm.identity" e imprimir [email protected] , por name="config.pkm.inner_identity" e imprimir [email protected] , e por name="config.pkm.password" e imprimir 382738

O Grep produz apenas [email protected] , [email protected] e 382738 .

    
por Mehran Goudarzi 30.03.2016 / 09:08

2 respostas

1

Você realmente deve usar um analisador HTML para isso, mas uma solução Awk (frágil) seria:

 awk -F'"' '/pkm.identity/ {id = $8}; /inner_/ {inner = $8}; /password/ {pass = $8} END {print id" "inner" "pass}' file
 [email protected] [email protected] 382738
    
por 30.03.2016 / 10:06
0

Para capturar informações na forma de consulta, você deve usar regex grupos de captura que estão ausentes em grep . Portanto, tente filtrar o comando curl output com sed (ou awk ):

sed -n 's/.*name="config.pkm.identity" value="\(.[^"]*\)".*$//p'

onde o valor do campo valor é capturado em (grupo de captura de regex # 1). Isto irá mostrar o valor do campo nome é config.pkm.identity .

Para nome é config.pkm.password use:

sed -n 's/.*name="config.pkm.password" value="\(.[^"]*\)".*$//p'

e etc.

Para mostrar todos os valores disponíveis de nomes correspondentes, use:

sed -n 's/.*name=".*" value="\(.[^"]*\)".*$/</p'

UPDATE para comentar

Para escolher os valores correspondentes na consulta de um sed, use o seguinte esquema: Use o agrupamento regex adicional com | pipe sign, o que significa OR statement. Isso permite que sed faça escolhas a partir de um determinado conjunto de variantes para corresponder aos resultados finais (observe também que os dois% parêntese | pipe e ( ) parênteses)

Por exemplo:

sed -n -e 's/.*name="\(config.pkm.identity\|config.pkm.inner_identity\|config.pkm.password\)" value="\(.[^"]*\)".*$//p'

isso pesquisará e exibirá os dados dos nomes config.pkm.identity , config.pkm.inner_identity e config.pkm.password no fluxo.

Note também que a referência final do grupo de captura regex é - agora é o segundo grupo.

    
por 30.03.2016 / 12:26