Мы проводим некоторые исследования безопасности, для которых мне нужно извлечь из репозиториев Debian все доступные имена пакетов, версии, описание и т. Д.
Я пытаюсь разобрать вывод apt-cache dumpavail
в CSV и упорядочить данные в табличной форме, такой как имя, версия, описание.
Я не очень хорошо разбираюсь в AWK, но я думаю, это идеальный инструмент для этого? Не стесняйтесь, порекомендуйте мне способы сделать хорошее регулярное выражение для AWK.
думаю sed
может быть лучше подходит, например с GNU sed:
parse.sed
/^Package: / { s///; h }
/^Version: |^Description: / { s///; H }
/^$/ { x; s/\n/;/gp }
Пояснение:
/^Package/
s///
, т.е. заменить ранее подобранный шаблон ничемh
) или (H
), Обратите внимание h
перезаписывает удерживаемое пространство/^$/
), поменяйте местами удерживаемое пространство и пространство образца (x
) и замените новые строки желаемым разделителем, здесь точка с запятой (s/\n/;/gp
) и распечатайте результатЗапускаем так:
apt-cache dumpavail | sed -nEf parse.sed
С участием head
прилагается вывод:
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
Вот немного Perl. Требуется текст :: CSV из 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