Uma cadeia de datas de sed do Liner para unixtime

3

Estou executando o seguinte comando:

cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'

Que retorna a seguinte string

04-nov-2018

Eu, então, quero executar essa string por meio do seguinte comando:

date -d '04-nov-2018' + "%s"

que retornará o unixtime:

1541304000

Como executo isso em uma única linha de comando?

    
por whoisearth 14.11.2017 / 16:40

3 respostas

4

Você pode executar um comando dentro de um $( ) , para poder dizer diretamente:

date -d "$(command)" + "%s"

No seu caso:

date -d "$(sed -n -e 's/^.*Expire: //p' /tmp/myfile.log)" + "%s"

Observe também que estou dizendo sed '...' file em vez de cat file | sed '...' , pois sed pode ler diretamente do arquivo.

    
por 14.11.2017 / 16:52
3

Já que você parece ter a implementação GNU de date , você pode fazer:

</tmp/myfile.log sed -n 's/^.*Expire: //p' | date -f - +%s

Com o GNU sed (e ainda o GNU date ), você também pode fazer:

</tmp/myfile.log sed -n 's/^.*Expire: /date +%s -d/ep'

(assumindo que POSIXLY_CORRECT não está no ambiente)

Mas cuidado, pois isso equivale a uma vulnerabilidade de injeção de comando se você não puder garantir que o que está depois de qualquer tag Expire: não é essa data nesse formato. Embora seja mais curto, ele também é muito menos eficiente do que o anterior, pois ele executa um shell e um comando date para cada linha correspondente (e recupera sua saída por meio de um pipe, para posteriormente reproduzi-lo novamente no stdout).

Em sistemas não-GNU, você pode usar perl :

</tmp/myfile.log perl -MTime::Piece -lne '
  print Time::Piece->strptime($1, "%d-%b-%Y")->epoch if /Expire: (\S+)/'

Ou use o recurso de análise de data do seu shell se estiver usando os recursos avançados, como zsh ( strftime -r builtin) ou ksh93 ( printf %T ).

    
por 14.11.2017 / 17:28
1

Use substituição:

date -d "'cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p''" + "%s"

Ao redor do seu primeiro comando com ' , você pode usar sua saída como parte de outro comando. Ao redor disso, por sua vez, com " ajuda a evitar complicações se a saída do primeiro comando contiver espaços ou caracteres especiais.

    
por 14.11.2017 / 18:33

Tags