Como cortar a saída apenas para reunir o nome do arquivo e o parâmetro get?

2

Eu tenho vários arquivos com vários links que são formatados assim:

<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

Lembre-se de que FOO , BAR e FNORD podem diferir.

Agora, quero garantir que todos esses arquivos tenham os atributos corretos definidos. Para esse propósito, eu quero usar ack-grep e cut.

ack-grep -a ?parameter= *.txt

obtendo a saída:

fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

No entanto, estou completamente perdido sobre como posso cortar a saída para ver apenas:

fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA
    
por k0pernikus 28.11.2011 / 16:41

3 respostas

1

Eu não tenho o utilitário ack-grep no meu mac, então essa solução awk funcionará para você?

awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' INPUT_FILE

Execução:

[jaypal:~/Temp] cat file0
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
    <img ... />
</a>

[jaypal:~/Temp] awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' file0
file0
parameter=FOO-_-BAR-_-FNORD

Provável trabalho para você:

Se a obtenção do nome do arquivo juntamente com os valores de parâmetro for crítica, você poderá executar isso com um for loop simples ou poderá redirecionar a saída que está recebendo atualmente para um arquivo ou canalizá-la para o seguinte awk one-liner.

Simples para loop:

[jaypal:~/Temp] for i in ./file*.txt; do awk -v FS=[?\"] '/param/{print FILENAME; print $3"\n" }' "$i"; done
./file01.txt
parameter=FOO-_-BAR-_-FNORD

./file02.txt
parameter=POIT-_-NARF-_-BAZINGA

Redirecionando sua saída atual para um arquivo e chamando awk :

O exemplo a seguir pressupõe redirection de sua saída atual para um arquivo chamado temp.file .

[jaypal:~/Temp] cat temp.file 
fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">

fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">

[jaypal:~/Temp] awk -v FS=[?\"] 'NF==1{ print $0 }/param/{ print $3"\n" }' temp.file 
fileName.txt
parameter=FOO-_-BAR-_-FNORD

fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA
    
por 29.11.2011 / 04:49
2

Você pode usar o argumento --output EXPR para ack-grep para imprimir seletivamente apenas parte da linha. Tenha em mente que o ack-grep é um script Perl, o argumento EXPR é qualquer expressão Perl; Neste caso, eu uso parênteses na correspondência de padrões para pegar apenas a parte da linha da? para o fechamento "(eu também uso a barra invertida para citar o metacar de regexp '?', o que você não fez, embora talvez como um primeiro caractere em um regexp que pode acontecer de funcionar).

ack-grep -a --output '$1' '\?(parameter=.*?)"'

Observe o último? na regexp torna o. * não-ganancioso, de modo que coincida com o primeiro "e não o último na linha.

Isso gera linhas de saída como 1:parameter=FOO-_-BAR-_-FNORD - você pode suprimir o primeiro: com o argumento -h para ack-grep.

    
por 28.11.2011 / 21:03
0

Não tenho certeza se entendi e não estou familiarizado com o utilitário ack-grep, mas por que você não tenta cortar a primeira ocorrência? para o "?

Algo como o seguinte:

Por motivo de legibilidade, eu coloquei a tag html em uma variável

var='<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">'

cut -d '?' -f 2- <(echo $var ) | cut -d '"' -f 1
    
por 28.11.2011 / 17:19