Como faço para encontrar uma data e hora em um arquivo e, em seguida, ecoar no conteúdo do arquivo como a primeira linha?

4

Eu tenho o seguinte comando que estou tentando ajustar:

 stat -c %y test.txt | sed 's/^\([0-9\-]*\)//'

Isso retorna as seguintes informações:

 2016-08-03 14:52:24.000000000

Eu preciso ajustar isso para que exclua o ".000000000". Eu tentei algumas opções diferentes, mas não consigo acertar. Por fim, preciso pegar o registro de data e hora que eu extraio do comando acima e fazer o eco como a primeira linha no arquivo.

Eu tenho este comando como um exemplo que parece adicionar corretamente uma nova linha ao topo do arquivo:

   sed -i '1s/^/this should be a date\n/' test.txt

Como eu combino os dois comandos?

    
por Happydevdays 03.08.2016 / 17:17

3 respostas

4
sed -i "1i$(stat -c %y test.txt | sed -r 's/\.[0-9]+ / /')" test.txt
    
por Florian Diesch 03.08.2016 / 17:28
5

Assim:

( stat -c %y test_file.txt | awk -F '.' '{print }' ; cat test_file.txt  ) > /tmp/temp_file && mv /tmp/temp_file test_file.txt

Aqui está uma pequena demonstração:

$> echo "Hello World" > test_file.txt
$> ( stat -c %y test_file.txt | awk -F '.' '{print }' ; cat test_file.txt  ) > /tmp/temp_file &&                       
> mv /tmp/temp_file test_file.txt
$> cat test_file.txt                                                                                                     
2016-08-03 09:24:27
Hello World

Explicação:

  • Recebemos o registro de data e hora e o conteúdo do arquivo em subshell, representado por parênteses (...)
  • stat -c %y test_file.txt | awk -F '.' '{print }' trimps timestamp
  • cat test_file.txt lê o conteúdo do arquivo.
  • O texto resultante é timestamp mais o que estava no arquivo, está sendo redirecionado para /tmp/temp_file
  • Finalmente, substituímos o arquivo original pelo conteúdo de /tmp/temp_file
por Sergiy Kolodyazhnyy 03.08.2016 / 17:26
4

Que tal usar ed em vez de sed ?

$ ed -s test.txt << EOF
0r !stat -c \%y %
1 s/\.[0-9]*//
w
q
EOF

Isso diz:

  • leia a saída do comando stat -c \%y % e insira-o na posição 0 no buffer, ou seja, antes da primeira linha. Observe que, em ed , um un escapou de % é uma abreviação do arquivo atual.
  • nesta linha (agora primeiro), substitua nada no lugar do período decimal e depois dos dígitos
  • escreva o resultado no arquivo e saia

O -s é opcional - apenas impede que ed emita contagens de linha. Se stat anexar um deslocamento de fuso horário em seu idioma / fuso horário e você quiser removê-lo também, você poderá modificar o comando s para remover o período e tudo o que o segue, por ex. s/\..*//

Também é possível usar ed em um one-liner, recebendo seus comandos da entrada padrão usando echo ou printf , embora seja um pouco difícil obter o escape certo:

printf '0r !stat -c \%%y %%\n1 s/\.[0-9]*//\nw\nq' | ed -s test.txt
    
por steeldriver 03.08.2016 / 18:17