Analisando csv com sed e perl one-liner?

1

Eu tenho um servidor web que armazena configurações no PostgreSQL, e eu planejo recuperar informações de uma determinada tabela e depois analisá-las no formato csv.

PAYLOAD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><rule roleDefinition="false" id="1168" type="COMMON" enabled="true" owner="admin" buildingBlock="false" scope="LOCAL"><name>Recon: Remote Windows Server Scanner</name><notes>Reports a remote host attempting reconnaissance or suspicious connections on common Windows server ports to more than 60 hosts in 10 minutes.</notes><testDefinitions><test uid="4" id="80" name="com.q1labs.semsources.cre.tests.ThresholdFunction_Test" group="Functions"><text>when any of these &lt;a href='javascript:editParameter("4", "1")' class='dynamic'&gt;BB:CategoryDefinition: Recon Events, BB:CategoryDefinition: Suspicious Events&lt;/a&gt; with the same &lt;a href='javascript:editParameter("4", "2")' class='dynamic'&gt;source IP&lt;/a&gt; more than &lt;a href='javascript:editParameter("4", "3")' class='dynamic'&gt;5&lt;/a&gt; times, across &lt;a href='javascript:editParameter("4", "4")' class='dynamic'&gt;more than&lt;/a&gt; &lt;a href='javascript:editParameter("4", "5")' class='dynamic'&gt;59&lt;/a&gt; &lt;a href='javascript:editParameter("4", "6")' class='dynamic'&gt;destination IP&lt;/a&gt; within &lt;a href='javascript:editParameter("4", "7")' class='dynamic'&gt;10&lt;/a&gt; &lt;a href='javascript:editParameter("4", "8")' class='dynamic'&gt;minutes&lt;/a&gt;</text>

Etapas

perl -nle '
my @enabled = /(?<=enabled="").*?(?<=\"\")/g;
chop(@enabled);
chop(@enabled);
chomp(@enabled);
my @group = /(?<=group="").*?(?<=\"\")/g;
chop(@group);
chop(@group);
chomp(@group);
my @name = /(?<=<name>).*?(?=<\/name>)/g;chomp(@name);
my @text = /(?<=<text>).*?(?=<\/text>)/g;chomp(@text);
print "@enabled;@group;@name;@text"
' Rules.csv |sed 's/\&lt\;/</g'|sed 's/\&gt\;/>/g' | sed -e 's/<*>//g' -e '/ *$/d' > Rules2.csv

Rules2.csv não mostra conteúdo e arquivo vazio, no entanto, quando eu quebro o comando, recebo alguns resultados muito positivos. Consulte pastebin (como o código) é um pouco longo demais. A análise pastebin mostraria que em algum lugar na seção de comandos sed -e 's/<*>//g' -e '/ *$/d' resulta em vazio meu arquivo Rules2.csv. Mas não sei por que ou o que está causando esse comportamento.

Qualquer ajuda que me ajude a alcançar a saída desejada, como mostrado em pastebin, seria maravilhosa.

    
por user3066819 10.01.2014 / 21:29

1 resposta

1

Embora você não deva analisar XML com regexes , isso funciona com sua entrada de exemplo:

perl -ple '
    ($enabled) = /(?<=enabled=").*?(?=")/g;
    ($group)   = /(?<=group=").*?(?=")/g;
    ($name)    = /(?<=<name>).*?(?=<\/name>)/g;
    ($text)    = /(?<=<text>).*?(?=<\/text>)/g;
    $_= "$enabled;$group;$name;$text";
    s/&lt;.*?&gt;//g;
' Rules.csv
true;Functions;Recon: Remote Windows Server Scanner;when any of these BB:CategoryDefinition: Recon Events, BB:CategoryDefinition: Suspicious Events with the same source IP more than 5 times, across more than 59 destination IP within 10 minutes

Notas:

  • suas restrições "ativadas" e "de grupo" foram quebradas
  • se você está trabalhando em perl, você não precisa canalizar para sed
  • a razão s/<*>//g apaga toda a saída é que você está combinando zero ou mais colchetes abertos até o último colchete de fechamento - isso corresponde à sua cadeia inteira.
    • você provavelmente pretendeu s/<[^>]*>//g
por 10.01.2014 / 22:10