Quelle est la façon la plus rapide d'ajouter du texte à un fichier à partir de la ligne de commande?


30

Parfois, j'ai une pensée que je veux écrire dans un fichier pendant que je suis au terminal. Je voudrais que ces notes soient toutes dans le même fichier, juste énumérées l'une après l'autre. Je voudrais également une étiquette date / heure sur chacun d'eux.

Est-il possible de le faire sans avoir à ouvrir le fichier à chaque fois? Puis-je simplement l'entrer dans le terminal et le faire ajouter au fichier à chaque fois avec une commande ou un script?

J'utilise GNU BASH.

Réponses:


25

Écrivez-vous un script shell appelé "n". Mettez ça dedans:

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

Je le recommande plutôt que cat >> notefileparce que:

  1. Un jour, vous serez tellement pressé que vous échapperez le >> et tapez> à la place et que vous supprimerez votre fichier.
  2. Emacs démarre en cinq centièmes de seconde sur mon Mac Mini. Il faut un dixième de seconde pour démarrer sur un système basé sur Celeron vieux de dix ans que j'ai assis autour. Si vous ne pouvez pas attendre aussi longtemps pour commencer à taper, alors vous êtes déjà une machine et vous n'avez pas besoin de prendre des notes. :)

Si vous insistez pour éviter un éditeur de texte, utilisez une fonction shell:

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

qui devrait fonctionner dans tous les shells revendiquant la compatibilité du shell Bourne.


1
Comment la nfonction écrit-elle dans le fichier? Ne voulez-vous pas dire quelque chose comme un echo "$*"plutôt que UUOC ? Comment intègre-t-il la balise date / heure?
jasonwryan

1
Pas tout à fait inutile. Il lit à partir de stdin, où l'utilisateur tapera sa note. J'ai cependant oublié l'horodatage.
Kyle Jones

Je ne suis pas nécessairement d'accord sur l'UUOC, mais vous avez votre point de retour pour la date ...
jasonwryan

5
+1 joli codage défensif et justification contre l'inévitable faute de frappe.
msw

2
Kyle, vous ne évidemment pas de 90Mo .emacs.d. Oui, je dois nettoyer ça.
quodlibetor

19

De plus, pour écrire plusieurs lignes dans un fichier à partir de la ligne de commande, procédez comme suit:

cat >> sometextfile.txt << EOF
text
more text
and another line
EOF

1
Ou cat > sometextfile.txt << EOFpour écraser le fichier existant.
mbomb007

10

Utilisez simplement echo:

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

Vous pouvez utiliser >> pour ajouter à un fichier, ou utiliser> pour l'écraser.


3

Beaucoup de cloches et de sifflets soignés ici!

Méthode KISS:

date >>filename; cat >>filename


1

Selon vos besoins, syslogd peut être un autre outil à parcourir. La commande

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

enregistrera le message avec la fonction user.notice. Avec de nombreux systèmes Linux, cela suffira pour ouvrir et ajouter un fichier /var/log/user.log, avec d'autres, vous devrez peut-être définir une gestion pour cette installation et ce niveau de journal (ou, selon l'installation que vous choisissez - le local0 aux installations locales7 sont généralement libres d'affecter à des choses comme celle-ci.

Il a l'avantage de pouvoir (alias configurable) envoyer des notes des machines clientes à un serveur de journalisation central, quelque chose que j'aime utiliser pour garder une trace de l'action administrative car il préserve automatiquement l'horodatage, les informations utilisateur et hôte, tout en gardant les actions dans l'ordre .

sortie résultante dans le fichier local:

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

Exemple de ligne de configuration syslog sous Solaris :

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

Remarque: Le ifdefest prétraité avec m4, sur la machine avec le nom d'hôte / hostalias "loghost", les messages seront enregistrés dans le fichier / var / log / diary, sur tous les autres, ils seront envoyés au service syslog distant sur loghost. Pour tester ce type de configuration, le fichier de configuration peut être envoyé via m4 pour l'expansion (laissez le -D LOGHOSTpour voir à quoi il ressemblerait sur un système non appelé loghost :

theuser@solstice$ /usr/ccs/bin/m4 -D LOGHOST /etc/syslog.conf



0

Combiner quelques réponses différentes pour réaliser ce que je cherchais, qui était plusieurs options.

  1. Rapide
    user @ hostname: ~ / Documents $ echo text >> filename
    utilisateur @ nom d'hôte: ~ / Documents $ cat nom de fichier
    texte
    
  2. Plusieurs lignes
    user @ hostname: ~ / Documents $ cat >> filename2 << EOF
    > ligne de texte 1
    > ligne de texte 2
    > ligne de texte 3
    > EOF
    user @ hostname: ~ / Documents $ cat filename2  
    ligne de texte 1
    ligne de texte 2
    ligne de texte 3
    
    1. Modifier un fichier à un numéro de ligne donné

      user @ hostname: ~ / Documents $ sed -i '2iinserting new line' filename2
      user @ hostname: ~ / Documents $ cat filename2
      ligne de texte 1
      insertion d'une nouvelle ligne
      ligne de texte 2
      ligne de texte 3
      
    En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
    Licensed under cc by-sa 3.0 with attribution required.