Truncar a precisão de uma data

2

Estou trabalhando com um script bash que pesquisa o progresso de vários sistemas diferentes. Se uma compilação estiver concluída, stat s um arquivo de log para descobrir a última vez que foi editado, alimentará esse tempo em date para produzir uma saída legível quando a compilação for concluída.

Como isso está sendo executado em alguns sistemas diferentes, temos uma saída semelhante a:

sys00 finished around:        2015-06-11 01:42:29.484345955 -0700
sys01 finished around:        2015-06-11 01:21:17.560101447 -0700
sys02 finished around:        2015-06-11 03:51:56 -0700
sys03 finished around:        2015-06-11 04:32:12 -0700
sys04 finished around:        2015-06-11 01:40:47.977893386 -0700
sys05 finished around:        2015-06-11 01:16:12.158137851 -0700

Minha prioridade é fazer com que pareçam iguais e, como não preciso da precisão extra do primeiro e do último sistema, só quero cortar isso. Eu tenho tentado fazer isso com awk :

echo $TIME | awk '[0-9]{9} {gsub('', '[0-9]{9}')}' -

mas teve pouco sucesso. Eu não estou familiarizado o suficiente com sed para decidir se seria uma ferramenta mais apropriada aqui. E eu não tenho certeza se date pode ser instruído a deixá-lo desligado. Aqui está o comando date que estou usando atualmente:

COMMAND='date -r 'stat -f "%m" '"$BASENAME"'/../logs/catTest*.log |& head -n1' +"%Y-%m-%d %H:%M:%S %z"'

(Onde $BASENAME é o caminho base que usamos para encontrar o arquivo de log.)

Como posso me livrar desses dígitos incômodos após o período?

    
por ssonicblue 11.06.2015 / 23:45

3 respostas

0

para uma resposta de sed , você pode usar isso para filtrar as decimais:

sed 's/\.[0-9]\{1,\}//'

Como funciona:

  • \. corresponderá a um literal .
  • [0-9]\{1,\} corresponderá a um ou mais dígitos

O padrão resultante significa "corresponde a um literal . seguido por um ou mais dígitos" e substitui isso por nada.

    
por 12.06.2015 / 00:06
0

Se eu entender sua pergunta corretamente. Sua saída desejada é

out.txt

sys00 finished around: 2015-06-11 01:42:29 sys01 finished around: 2015-06-11 01:21:17 sys02 finished around: 2015-06-11 03:51:56 sys03 finished around: 2015-06-11 04:32:12 sys04 finished around: 2015-06-11 01:40:47 sys05 finished around: 2015-06-11 01:16:12

use o separador de campo do awk

awk -F. '{print $ 1}' inputfile.txt | awk -F- '{print $ 1, $ 2, $ 3}'

Se você quiser uma saída como essa out2.txt

sys00 finished around: 2015 06 11 01:42:29 -0700 sys01 finished around: 2015 06 11 01:21:17 -0700 sys02 finished around: 2015 06 11 03:51:56 -0700 sys03 finished around: 2015 06 11 04:32:12 -0700 sys04 finished around: 2015 06 11 01:40:47 -0700 sys05 finished around: 2015 06 11 01:16:12 -0700

awk -F. '{print $ 1}' tst.txt | awk -F- '{print $ 1, $ 2, $ 3, "-0700"}'

    
por 12.06.2015 / 00:03
0

Estou surpreso que você tenha recebido algo, já que stat -f "%m" ... não é válido. Tem certeza de que copiou a versão atual do seu comando?

Parece que você está usando -c (especificar formato) não -f (sistema de arquivos) você obtém o ponto de montagem para a lista de arquivos que você fornece para stat, que você truncar para um único caminho e depois ter data stat ponto de montagem e fornecer um formato.

existem várias coisas que você pode fazer para acelerar ou simplificar a primeira das quais é não usar data.

COMMAND='stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1'

isso infelizmente é dependente do local e inclui nanossegundos, então podemos usar

COMMAND='LC_ALL=C stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1|sed "s/\.[0-9]\+//"'

Uma segunda opção é não ter um status de chamada de data

COMMAND='date 'stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1' +"%Y-%m-%d %H:%M:%S %z"'

Se isso ainda exibir nanossegundos (o que não deveria, enviar um relatório de bug), você poderá filtrar com uma expressão regular mais simples.

COMMAND='date 'stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1' +"%Y-%m-%d %H:%M:%S %z"|sed "s/\.0\+//"'

Há mais uma coisa que poderia acelerar as coisas (dependendo se é mais rápido para todos os arquivos de log ou gerar outra tarefa) e que é para filtrar os arquivos antes de stat

COMANDO = ls "$ BASENAME" '/../ logs / catTest * .log | head -n1 | LC_ALL = C xargs stat -fc "% y" | sed "s /. [0-9] + // '

    
por 12.06.2015 / 01:51