Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

shell: ajouter du texte en début de ligne d'un fichier

4 réponses
Avatar
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


merci et a+

f=2E

4 réponses

Avatar
fra-duf-no-spam
Le 13445ième jour après Epoch,
fabrice regnier écrivait:

bonjour la liste,

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 certain es
lignes (et pas en perl ;) )



[... tout plein de choses compliquées...]

grep discard /var/log/mail.log > $FILE



C'est pour un fichier de log ? Dans ce cas, il est probablement plus
aisé d'utiliser logtail ... Bien pratique ce petit programme.

Sinon, si tu veux vraiment faire ton usine à gaz ... ben demande à
quelqu'un d'autre, je m'en sens pas le courage, là ;)
Avatar
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.

--
jm

A.E.L. Sarl (R.C.S CASTRES 490843240)
http://www.affaires-en-ligne.com


--
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
Avatar
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


^
j'ai oublié le ' avant

--
jm

A.E.L. Sarl (R.C.S CASTRES 490843240)
http://www.affaires-en-ligne.com


--
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
Avatar
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

awk '!n[$0]++' <fichier_avec_doublons >fichier_sans_doublons

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