shell: ajouter du texte en début de ligne d'un fichier
4 réponses
fabrice regnier
bonjour la liste,
J'aimerai tagu=E9 un fichier en rajoutant un motif du genre <TRAITE> en
d=E9but de ligne de mon fichier.
La difficult=E9 provient du fait que je veux taguer uniquement certaines
lignes (et pas en perl ;) )
Par exemple:
# cat fichier
toto ceci est la ligne 1
titi ceci est la ligne 2
tata ceci est la ligne 3
toto ceci est la ligne 4
tutu ceci est la ligne 5
Je fait un grep toto dans fichier_tempo
# cat fichier_tempo
toto ceci est la ligne 1
toto ceci est la ligne 4
Ensuite, dans un script qui lit fichier_tempo, je voudrais tagger les 2
lignes "toto ceci est la ligne 1" et "toto ceci est la ligne 4" du
fichier et avoir ainsi en bout de course:
# cat fichier
<TRAITE>toto ceci est la ligne 1
titi ceci est la ligne 2
tata ceci est la ligne 3
<TRAITE>toto ceci est la ligne 4
tutu ceci est la ligne 5
Pourquoi ceci ? pour ne prendre que les nouvelles lignes "toto" lorsque
je relancerai le script.
Voici mon script actuel qui n'attend plus que le TAG.
internet:/home/fregnier/scripts# cat verif_spam.sh
#fab le 24/10/2006
#v=E9rifier dans mail.log les nouveaux spam (qui sont en DISCARD) et
envoy=E9 les expediteurs et destinataires =E0 root.
#on tag les spam lorsqu'ils ont =E9t=E9 trait=E9
FILE=3D/tmp/spam
FILE2=3D/tmp/spam2
rm $FILE $FILE2
grep discard /var/log/mail.log > $FILE
if test -s $FILE
then
cat $FILE | while read LALIGNE
do
QUAND=3D`echo $LALIGNE | awk '{print $1" "$2" "$3" " }'`
TO_FROM=3D`echo $LALIGNE | awk -F";" '{print $2 }'`
echo $QUAND $TO_FROM >> $FILE2
#je tag mail.log
# mais comment ?
done
#on envoi le resultat =E0 root
cat $FILE2 | mail -s "Spams re=E7us:" root
fi
Sinon, si tu veux vraiment faire ton usine à gaz ... ben demande à quelqu'un d'autre, je m'en sens pas le courage, là ;)
Jean-Michel OLTRA
Bonjour,
Le mardi 24 octobre 2006, fabrice regnier a écrit...
J'aimerai tagué un fichier en rajoutant un motif du genre <TRAITE> en début de ligne de mon fichier. La difficulté provient du fait que je veux taguer uniquement certaines lignes (et pas en perl ;) )
Par exemple: # cat fichier toto ceci est la ligne 1 titi ceci est la ligne 2 tata ceci est la ligne 3 toto ceci est la ligne 4 tutu ceci est la ligne 5
Je fait un grep toto dans fichier_tempo # cat fichier_tempo toto ceci est la ligne 1 toto ceci est la ligne 4
Ensuite, dans un script qui lit fichier_tempo, je voudrais tagger les 2 lignes "toto ceci est la ligne 1" et "toto ceci est la ligne 4" du fichier et avoir ainsi en bout de course:
# cat fichier <TRAITE>toto ceci est la ligne 1 titi ceci est la ligne 2 tata ceci est la ligne 3 <TRAITE>toto ceci est la ligne 4 tutu ceci est la ligne 5
Si tu connais ton motif, mettons 'toto', et si j'ai bien compris...
Je le fais en 2 passes car je ne suis pas doué avec sed :
1/ d'abord en fichier, mettons traite.sed, qui va ajouter la ligne <traité> avant la ligne 'toto'
# traite.sed /toto/i <traité>
2/ puis le passage :
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
ou tu reprends les exemples d'hier ou avant hier pour ne pas faire un fichier temporaire fichier_traite, si tu es sûr de toi.
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact
Bonjour,
Le mardi 24 octobre 2006, fabrice regnier a écrit...
J'aimerai tagué un fichier en rajoutant un motif du genre <TRAITE> en
début de ligne de mon fichier.
La difficulté provient du fait que je veux taguer uniquement certaines
lignes (et pas en perl ;) )
Par exemple:
# cat fichier
toto ceci est la ligne 1
titi ceci est la ligne 2
tata ceci est la ligne 3
toto ceci est la ligne 4
tutu ceci est la ligne 5
Je fait un grep toto dans fichier_tempo
# cat fichier_tempo
toto ceci est la ligne 1
toto ceci est la ligne 4
Ensuite, dans un script qui lit fichier_tempo, je voudrais tagger les 2
lignes "toto ceci est la ligne 1" et "toto ceci est la ligne 4" du
fichier et avoir ainsi en bout de course:
# cat fichier
<TRAITE>toto ceci est la ligne 1
titi ceci est la ligne 2
tata ceci est la ligne 3
<TRAITE>toto ceci est la ligne 4
tutu ceci est la ligne 5
Si tu connais ton motif, mettons 'toto', et si j'ai bien compris...
Je le fais en 2 passes car je ne suis pas doué avec sed :
1/ d'abord en fichier, mettons traite.sed, qui va ajouter la ligne
<traité> avant la ligne 'toto'
# traite.sed
/toto/i
<traité>
2/ puis le passage :
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
ou tu reprends les exemples d'hier ou avant hier pour ne pas faire un
fichier temporaire fichier_traite, si tu es sûr de toi.
--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"
To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Le mardi 24 octobre 2006, fabrice regnier a écrit...
J'aimerai tagué un fichier en rajoutant un motif du genre <TRAITE> en début de ligne de mon fichier. La difficulté provient du fait que je veux taguer uniquement certaines lignes (et pas en perl ;) )
Par exemple: # cat fichier toto ceci est la ligne 1 titi ceci est la ligne 2 tata ceci est la ligne 3 toto ceci est la ligne 4 tutu ceci est la ligne 5
Je fait un grep toto dans fichier_tempo # cat fichier_tempo toto ceci est la ligne 1 toto ceci est la ligne 4
Ensuite, dans un script qui lit fichier_tempo, je voudrais tagger les 2 lignes "toto ceci est la ligne 1" et "toto ceci est la ligne 4" du fichier et avoir ainsi en bout de course:
# cat fichier <TRAITE>toto ceci est la ligne 1 titi ceci est la ligne 2 tata ceci est la ligne 3 <TRAITE>toto ceci est la ligne 4 tutu ceci est la ligne 5
Si tu connais ton motif, mettons 'toto', et si j'ai bien compris...
Je le fais en 2 passes car je ne suis pas doué avec sed :
1/ d'abord en fichier, mettons traite.sed, qui va ajouter la ligne <traité> avant la ligne 'toto'
# traite.sed /toto/i <traité>
2/ puis le passage :
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
ou tu reprends les exemples d'hier ou avant hier pour ne pas faire un fichier temporaire fichier_traite, si tu es sûr de toi.
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact
Jean-Michel OLTRA
Bonjour,
Le mardi 24 octobre 2006, Jean-Michel OLTRA a écrit...
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact
Bonjour,
Le mardi 24 octobre 2006, Jean-Michel OLTRA a écrit...
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"
To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact
Jacques L'helgoualc'h
Jean-Michel OLTRA a écrit, mardi 24 octobre 2006, à 22:33 :
Bonjour,
bonjour,
Je le fais en 2 passes car je ne suis pas doué avec sed :
1/ d'abord en fichier, mettons traite.sed, qui va ajouter la ligne <traité> avant la ligne 'toto'
# traite.sed /toto/i <traité>
2/ puis le passage :
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
Plus direct,
sed -e '/toto/s/^/<traité>/' <mon_fichier >fichier_traité
ou encore
sed -i.old -e '/toto/s/^/<traité>/' fichier_modifié
Par ailleurs, pour purger les lignes répétées d'un fichier, sans le trier au préalable, on peut utiliser
ou une variante avec délimiteur et numéro de champ... -- Jacques L'helgoualc'h
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact
Jean-Michel OLTRA a écrit, mardi 24 octobre 2006, à 22:33 :
Bonjour,
bonjour,
Je le fais en 2 passes car je ne suis pas doué avec sed :
1/ d'abord en fichier, mettons traite.sed, qui va ajouter la ligne
<traité> avant la ligne 'toto'
# traite.sed
/toto/i
<traité>
2/ puis le passage :
sed -f traite.sed mon_fichier | sed /^<traité>/ N;s/n//' > fichier_traite
Plus direct,
sed -e '/toto/s/^/<traité>/' <mon_fichier >fichier_traité
ou encore
sed -i.old -e '/toto/s/^/<traité>/' fichier_modifié
Par ailleurs, pour purger les lignes répétées d'un fichier, sans le
trier au préalable, on peut utiliser
ou une variante avec délimiteur et numéro de champ...
--
Jacques L'helgoualc'h
--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"
To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
ou une variante avec délimiteur et numéro de champ... -- Jacques L'helgoualc'h
-- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"
To UNSUBSCRIBE, email to with a subject of "unsubscribe". Trouble? Contact