passa argumentos para o comando date no LHS do sed

1

Eu preciso converter uma string de data do formulário: "07 de janeiro de 2016 12:12:12 EDT" (de um relatório do nessus) para um simples 2016-01-07. Eu tenho a lógica de correspondência resolvida em sed (e python e awk) e a lógica de conversão também resolvida (fora do sed) com o uso do comando date: date "Jan 07, 2016 12:12:12 EDT" +%Y-%m-%d

Estou usando grupos de correspondências para capturar o mês, o dia e o ano, para que possa consultá-los nas referências de volta. Não consigo encontrar a combinação correta de aspas para que o comando de dados reconheça os argumentos no RHS de uma correspondência sed, por exemplo:

sed -E "s/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\s[0-9]{1,2}[,].[0-9]{1,4}.?[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}.\w{3})/'date -d "" "+%Y-%m-%d"'/g" 20170917.csv

Observe o uso de qualquer citação, resulta em data ignorando o primeiro argumento e imprimindo a data de hoje de acordo com o segundo argumento.

Eu tenho iterado usando " , ' , \" , \' para cercar os backrefs \ 1 e \ 2, mas parece que assim que eles são colocados em back carrapatos, "para permitir o comando date a ser executado, eles são ignorados.

A entrada é csv do relatório Tenable Nessus.

head tmp / 20180121.csv

(1) "Plugin", "Nome do Plugin", "Família", "Severidade", "Endereço IP", "Protocolo", "Porta", "Exploit?", "Repositório", "Endereço MAC", "Nome DNS", "Nome NetBIOS", "Texto Plugin", "Primeiro Descoberto", "Último Observado", "Reduzido em", "Estruturas de Exploração"

(2) "73571", "Vulnerabilidades múltiplas no Oracle Java SE (CPU de abril de 2014) (Unix)", "Misc.", "Crítico", "10.140.162.132", "TCP", "0", " Sim "," Verificação individual "," 00: 50: 56: c0: 00: 01 "," host.example.com "," "," Saída de plug-in: A seguinte instância vulnerável do Java é instalada no host remoto:

Caminho: / opt / Geneious_linux64_7_1_9_with_jre /   Versão instalada: 1.7.0_51   Versão fixa: 1.5.0_65 / 1.6.0_75 / 1.7.0_55 / 1.8.0_5 "," 21 de janeiro de 2018 22:14:50 EST "," 21 de janeiro de 2018 22:14:50 EST "," "," "

Cada linha numerada é um registro - (1) é o cabeçalho e (2) é representativa do restante.

As strings de data a serem convertidas estão na última linha da linha 2. Preciso que seja simplesmente: 2018-01-21 em ambos os casos.

    
por Rohn Wood 07.09.2018 / 22:16

1 resposta

0

Uma maneira comum de fazer isso é adicionar uma tabela de tradução e usar referências anteriores:

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/$/Jan01Feb02Mar03Apr04May05Jun06Jul07Aug08Sep09Oct10Nov11Dec12/
  s/^(...) (..), (....).*(..).*/--/'

Se você quisesse ter sed run date para traduzir a data, você teria que usar uma extensão GNU: o e do comando s (e também a extensão GNU date -d ).

echo 'Jan 07, 2016 12:12:12 EDT' | sed -E '
  s/^([[:alpha:]]{3} [[:digit:]]{2}, [[:digit:]]{4}).*$/date -d "" +%F/e'

Apesar de significar a execução de um shell e date para cada linha de entrada, o que é bastante ineficiente (e também perigoso, pois temos que interpretar código gerado dinamicamente com base em entrada que não sabemos se pode confiar ou não). Você também pode usar um processador de texto que possa fazer a tradução por si só como perl , se não quiser implementá-lo em sed .

    
por 08.09.2018 / 00:08

Tags