AWK 帮助将数据过滤为 CSV

AWK 帮助将数据过滤为 CSV

我们正在进行一些安全研究,我需要从 Debian 存储库中提取所有可用的软件包名称、版本、描述等。

我正在尝试将输出解析为apt-cache dumpavailCSV,并将数据组织成表格形式,如名称、版本、描述。

我不太擅长 AWK,但我猜它是这方面的完美工具?请随意向我推荐可以为 AWK 制作良好正则表达式的方法。

答案1

我认为sed可能更适合,例如使用 GNU 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

答案2

这是一些 Perl。需要 CPAN 中的 Text::CSV

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

相关内容