Qual é a maneira mais rápida de adicionar texto a um arquivo na linha de comando?

30

Ocasionalmente, penso que desejo gravar em um arquivo enquanto estou no terminal. Gostaria dessas notas todas no mesmo arquivo, listadas uma após a outra. Eu também gostaria de uma marca de data / hora em cada uma.

É possível fazer isso sem precisar abrir o arquivo toda vez? Posso inseri-lo no terminal e anexá-lo ao arquivo toda vez com um comando ou script?

Estou usando o GNU BASH.

Brian Dant
fonte

Respostas:

25

Escreva para si mesmo um script de shell chamado "n". Coloque isso nele:

#!/bin/sh
notefile=/home/me/notefile
date >> $notefile
emacs $notefile -f end-of-buffer

Eu recomendo isso em vez de cat >> notefileporque:

  1. Um dia, você estará com tanta pressa que digitará o >> e digitar> em vez disso e explodirá seu arquivo.
  2. O Emacs começa em cinco centésimos de segundo no meu Mac Mini. Demora um décimo de segundo para começar em um sistema baseado em Celeron com dez anos de idade. Se você não pode esperar tanto tempo para começar a digitar, já é uma máquina e não precisa fazer anotações. :)

Se você insistir em evitar um editor de texto, use uma função shell:

n () { date >> /home/me/notefile; cat >> /home/me/notefile; }

que deve funcionar em todos os shells que reivindicam compatibilidade com o shell Bourne.

Kyle Jones
fonte
1
Como a nfunção grava no arquivo? Você não quer dizer algo como um echo "$*"em vez de UUOC ? Como ele incorpora a marca de data / hora?
precisa saber é o seguinte
1
Não é totalmente inútil. Ele lê a partir de stdin, que é onde o usuário digitará sua nota. Mas eu esqueci o carimbo de data.
Kyle Jones
Eu não necessariamente concordo com o UUOC, mas você tem que apontar para a data ...
jasonwryan
5
+1 boa codificação defensiva e justificativa contra o erro inevitável.
msw
2
Kyle, você obviamente não tem 90MB .emacs.d. Caramba, eu preciso limpar isso.
quodlibetor
19

Além disso, para gravar várias linhas em um arquivo na linha de comando, faça:

cat >> sometextfile.txt << EOF
text
more text
and another line
EOF
regretoverflow
fonte
1
Ou cat > sometextfile.txt << EOFpara substituir o arquivo existente.
mbomb007 18/07
10

Basta usar echo:

echo $(date) Hi. >> notes.txt

Você pode usar >> para anexar a um arquivo ou> para substituí-lo.

Rob Wouters
fonte
3

Muitos sinos e assobios arrumados aqui!

Método KISS:

date >>filename; cat >>filename
Jan Steinman
fonte
2

Se você tiver o ruby ​​instalado no seu computador, poderá usar https://github.com/minhajuddin/taskr . Dessa forma, você obtém uma boa visualização de suas anotações com tags e as horas decorridas.

Screenshot Taskr

Khaja Minhajuddin
fonte
Bem, as capturas de tela geralmente parecem muito bem, mas se você puder, é muito melhor se você usar copiar e colar.
peterh diz restabelecer Monica
1

Dependendo das suas necessidades, o syslogd pode ser outra ferramenta para ler. O comando

theuser@tetrad:~$ logger This message is sent to syslog

registrará a mensagem com o recurso user.notice. Em muitos sistemas Linux, isso será suficiente para que um arquivo /var/log/user.log seja aberto e anexado; com outros, você pode precisar definir um tratamento para esse recurso e nível de registro (ou, qualquer que seja o local escolhido - o local0 às instalações locais7 geralmente são livres para serem atribuídas a coisas como esta.

Tem o benefício de poder (também conhecido como configurável) enviar notas das máquinas clientes para um servidor de log central, algo que eu gosto de usar para acompanhar as ações administrativas, pois preserva as informações de carimbo de data e hora, do usuário e do host automaticamente, mantendo as ações em ordem .

saída resultante no arquivo local:

theuser@tetrad:~$ tail /var/log/user.log
Jan 31 07:18:37 tetrad theuser: This message is sent to syslog

Exemplo para a linha de configuração do syslog no Solaris :

local5.notice             ifdef(`LOGHOST', /var/log/diary, @loghost)

Nota: Quando ifdefsão pré-processadas m4, na máquina com o nome do host / hostalias "loghost", as mensagens serão registradas no arquivo / var / log / diário; em todas as outras, elas serão enviadas para o serviço syslog remoto no loghost. Para testar esse tipo de configuração, o arquivo de configuração pode ser enviado através do m4 para expansão (deixe de lado -D LOGHOSTpara ver como ficaria em um sistema não chamado loghost :

theuser@solstice$ /usr/ccs/bin/m4 -D LOGHOST /etc/syslog.conf
Tatjana Heuser
fonte
1
echo "`date` text here" >> filename

ou

echo "text here `date`"|tee -a filename

mais sobre tee

Balaswamy vaddeman
fonte
somente backtick único
Balaswamy vaddeman
1
Pelo que vale, eu recomendaria o uso $(..)dos backticks para substituição de comandos. Mais informações: unix.stackexchange.com/questions/11576/…
rahmu
0

Combinando algumas respostas diferentes para alcançar o que eu procurava, que eram várias opções.

  1. Rápido
    user @ hostname: ~ / Documents $ echo text >> nome do arquivo
    user @ hostname: ~ / Documents $ cat nome do arquivo
    texto
    
  2. Várias linhas
    user @ hostname: ~ / Documents $ cat >> filename2 << EOF
    > linha de texto 1
    > linha de texto 2
    > linha de texto 3
    > EOF
    user @ hostname: ~ / Documentos $ cat filename2  
    linha de texto 1
    linha de texto 2
    linha de texto 3
    
    1. Modifique um arquivo em um determinado número de linha

      user @ hostname: ~ / Documents $ sed -i '2 inserindo nova linha' filename2
      user @ hostname: ~ / Documentos $ cat filename2
      linha de texto 1
      inserindo nova linha
      linha de texto 2
      linha de texto 3
      
    conman253
    fonte