AWK ajuda a filtrar dados para CSV

2

Estamos fazendo uma pesquisa de segurança para a qual eu preciso extrair dos repositórios Debian todos os nomes de pacotes disponíveis, versões, desc, etc.

Estou tentando analisar a saída de apt-cache dumpavail no CSV e organizar os dados em uma forma tabular como nome, versão, desc.

Eu não sou muito bom no AWK, mas acho que é a ferramenta perfeita para isso? Sinta-se à vontade e me recomende as maneiras que eu posso fazer um bom regex para AWK.

    
por Gagan Pal 26.09.2018 / 15:14

2 respostas

1

Acho que sed pode ser mais adequado, por exemplo com o GNU sed:

parse.sed

/^Package: /                { s///; h }
/^Version: |^Description: / { s///; H }
/^$/                        { x; s/\n/;/gp }

Explicação:

  • Localize as linhas que começam com os prefixos desejados, por ex. %código%
  • Remova o prefixo /^Package/ , ou seja, substitua o padrão correspondido anteriormente por nada
  • Salve o restante no espaço de espera ( s/// ) ou ( h ), observe o H sobrescreve o espaço de espera
  • Quando uma linha vazia entre pacotes é encontrada ( h ), troca espaço e espaço padrão ( /^$/ ) e substitua novas linhas pelo delimitador desejado, aqui ponto e vírgula ( x ) e imprima o resultado

Execute assim:

apt-cache dumpavail | sed -nEf parse.sed

Com s/\n/;/gp anexado, a saída é:

0ad;0.0.23-1+b1;Real-time strategy game of ancient warfare                
0ad-data;0.0.23-1;Real-time strategy game of ancient warfare (data files)
0ad-data-common;0.0.23-1;Real-time strategy game of ancient warfare (common data files)
0xffff;0.8-1;Open Free Fiasco Firmware Flasher
2048-qt;0.1.6-1+b1;mathematics based puzzle game
2ping;4.2-1;Ping utility to determine directional packet loss
2vcard;0.6-1;perl script to convert an addressbook to VCARD file format
fonts-3270;2.0.0-1;monospaced font based on IBM 3270 terminals
389-admin;1.1.46-2;389 Directory Administration Server
libds-admin-serv0;1.1.46-2;Libraries for the 389 Directory Administration Server
    
por 26.09.2018 / 18:57
1

Aqui está um pouco de Perl. Requer texto :: CSV do CPAN

apt-cache dumpavail | perl -MText::CSV -00 -ane '
    BEGIN {
        $csv = Text::CSV->new({eol=>"\n"});
        @wanted = qw/Package Version Architecture Description/;
        $csv->print(STDOUT, \@wanted);
        $re = "(" . join("|", @wanted) . "): (.+?)(?=\Z|^[[:upper:]])";
    }
    %m = /$re/msg; 
    for $key (keys %m) {$m{$key} =~ s/\n//g} 
    $csv->print(STDOUT, [@m{@wanted}]);
' > avail.csv
    
por 26.09.2018 / 17:22

Tags