Ajouter un préfixe au début de chaque ligne
J'ai un fichier comme ci-dessous:
line1
line2
line3
Et je veux obtenir:
prefixline1
prefixline2
prefixline3
, je pourrais écrire un script Ruby, mais c'est mieux si je n'avez pas besoin.
prefix
contiendra /
. C'est un chemin, /opt/workdir/
, par exemple.
9 réponses
sed -e 's/^/prefix/' file
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file
# If you want to create a new file
sed -e 's/^/prefix/' file > file.new
Si prefix
contient /
, vous pouvez utiliser n'importe quel autre personnage n'est pas dans prefix
, ou
échapper à la /
, de sorte que la commande sed
devient
's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
Vous pouvez utiliser Vim en mode Ex:
ex -sc '%s/^/prefix/|x' file
%
sélectionnez toutes les ligness
remplacerx
enregistrez et fermez
Si votre préfixe est un peu compliqué, il suffit de le mettre dans une variable:
prefix=path/to/file/
Ensuite, vous passez cette variable et laissez awk s'en occuper:
awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
Utilisation du shell:
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
Bien que je ne pense pas que pierr ait eu cette préoccupation, j'avais besoin d'une solution qui ne retarderait pas la sortie de la "queue" en direct d'un fichier, puisque je voulais surveiller plusieurs journaux d'alerte simultanément, préfixant chaque ligne avec le nom de son journal respectif.
Malheureusement, sed, cut, etc. introduit trop de tampon et m'a empêché de voir les lignes les plus actuelles. La suggestion de Steven Penny d'utiliser l'option -s
de {[2] } était intrigante, et les tests ont prouvé qu'elle n'introduisait pas le tampon indésirable qui m'a concerné.
Il y avait quelques problèmes avec l'utilisation de nl
, cependant, liés au désir de supprimer les numéros de ligne indésirables (même si vous ne vous souciez pas de l'esthétique de celui-ci, il peut y avoir des cas où l'utilisation des colonnes supplémentaires serait indésirable). Tout d'abord, l'utilisation de "cut" pour supprimer les nombres réintroduit le problème de mise en mémoire tampon, de sorte qu'il détruit la solution. Deuxièmement, l'utilisation de "- w1" n'aide pas, car cela ne limite pas le numéro de ligne à une seule colonne - il est juste plus large que plus de chiffres sont nécessaires.
Ce n'est pas joli si vous voulez capturer cela ailleurs, mais puisque c'est exactement ce que je n'avais pas besoin de faire (tout était déjà écrit dans des fichiers journaux, je voulais juste en regarder plusieurs à la fois en temps réel), la meilleure façon de perdre les numéros de ligne et n'avoir que mon préfixe était de démarrer la chaîne -s
avec un retour chariot (CR ou ^m ou Ctrl-M). Ainsi, par exemple:
#!/bin/ksh
# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.
PGRP=$$
for LOGFILE in widget framas dweezil
do
(
tail -f $LOGFILE 2>&1 |
nl -s"^M${LOGFILE}> "
) &
sleep 1
done
read KILLEM
kill -- -${PGRP}
En utilisant ed:
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
Cette remplaçants, pour chaque ligne (,
), le début de la ligne (^
) avec prefix
. wq
enregistre et quitte.
Si la chaîne de remplacement contient une barre oblique, nous pouvons utiliser un délimiteur différent pour s
à la place:
ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE
J'ai cité le délimiteur here-doc EOE
("end of ed") pour empêcher l'expansion des paramètres. Dans cet exemple, cela fonctionnerait aussi sans citation, mais il est recommandé d'éviter les surprises si vous avez un $
dans votre ed script.
Voici un exemple enveloppé en utilisant l'approche sed
de cette réponse :
$ cat /path/to/some/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
Prefix_lines
function show_help()
{
IT=$(CAT <<EOF
Usage: PREFIX {FILE}
e.g.
cat /path/to/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
)
echo "$IT"
exit
}
# Require a prefix
if [ -z "$1" ]
then
show_help
fi
# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
# If no stdin exists
if [ -t 0 ]; then
show_help
fi
FILE=/dev/stdin
fi
# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE