grep - afficher que la première occurence trouvée? [Shell] - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 18-06-2003 à 11:12:05
(1) cat out.* | grep 'Subject' | tail -1 > report.txt
(2) for i in out.*; do echo -n "$i : " >> report.txt && cat $i | grep 'Subject' | tail -1 >> report.txt; done
Marsh Posté le 18-06-2003 à 11:15:10
merci minusplus, la première commande ne me sors que l'occurence du dernier fichier...
mais la deuxième marche nickel
bien qu'elle soit un peu longue à éxecuter...
Marsh Posté le 18-06-2003 à 12:05:35
Le cat ne sert à rien.
Il suffit de faire "grep chaine fichier" (et puis comme ça ça t'affichera le nom du fichier).
Si la ligne "Subject:" est identique, tu peux utiliser uniq pour la supprimer :
grep 'Subject:' out.* | uniq
Marsh Posté le 18-06-2003 à 12:07:02
merci pour la précision pour uniq.
Le cat me sert car je crér un nouveau fichier qd même...
Marsh Posté le 18-06-2003 à 14:53:48
duch a écrit : Le cat me sert car je crér un nouveau fichier qd même... |
oui, et ?
sinon je pense que tu peux faire un
(grep 'Subject:' out.* | head -n 1) > report.txt
Marsh Posté le 18-06-2003 à 14:56:37
KazeKami a écrit : |
EDIT: http://rhols66.adsl.netsonic.fi/era/unix/award.html
Marsh Posté le 18-06-2003 à 14:57:21
ReplyMarsh Posté le 18-06-2003 à 15:01:50
ReplyMarsh Posté le 18-06-2003 à 15:08:00
KazeKami >
merci beacoup pour la précision, j'ai pô tout compris mais j'vais regardé
mais comment tu fais pour boucler sur tous les fichiers?
Marsh Posté le 18-06-2003 à 15:17:38
duch a écrit : KazeKami > |
effectivement je suis fatigué, j'ai pas fait attention que tu faisais ca sur out.*
la solution de -/+ est bien en fait
Marsh Posté le 19-06-2003 à 10:27:39
je vous mets une nouvelle fois à contribution pour améliorer un poil le script...
j'aimerais renommer tous les fichiers de la forme out.* en out.*.reported (ça je sais faire), mais ce que je ne sais pas faire c'est ignorer les fichiers du type out.*.reported lorsque je crée le rapport (le but est de les appeler .reported pour les ignorer le prochain coup)
j'ai essayé ça :
Code :
|
la deuxième ligne qui renomme les fichiers marche évidemment mais il encaisse pas le grep dans la première...
il y a sans doute une syntaxe particulière dans le cas d'un for in mais j'la connais pô
Marsh Posté le 19-06-2003 à 10:51:10
ça :
|
ça va pas. ce que tu veux faire, c'est ça :
|
mais c'est moche. Dans ton cas vaut mieux utiliser find :
|
Marsh Posté le 19-06-2003 à 10:52:43
ou plus court :
|
tout ceci est à tester, hein !
Marsh Posté le 19-06-2003 à 10:55:29
arf
j'étais pas très loin, même si c'était moche
j'vais tester...
j'avais aussi ajouter ces 2 lignes ensuite mais j'suppose qu'on peux faire mieux :
echo "nombre de spams :" >> /var/spool/filter/report.txt
echo ls /var/spool/spam/out.* | grep -c reported >> /var/spool/filter/report.txt
(je ne sais notamment pas comment les ajouter au début du fichier) qui a dit newbie?
Marsh Posté le 19-06-2003 à 11:02:20
j'ai testé la première méthode, car j'avais d'autres lignes à ajouter et je ne voyais pas très bien comment faire.
je suis donc arriver à ça :
Code :
|
et j'obtiens :
paramètre manquant pour exec...
j'ai fait un man exec (en fait execve) et les parmaètres à mettre sont :
int execve (const char *filename, char *const argv [], char *const envp[]);
comprends pô tout môa...
PS : j'ai essayé aussi sans toucher à ta ligne et ça marche pô non plus
Marsh Posté le 19-06-2003 à 11:12:26
ha ui pardon !
|
Marsh Posté le 19-06-2003 à 11:34:22
bah en fait y'a plus d'erreur mais il ne crée pas le fichier report.txt
il ne manquerait pas le chemin pouyr accéder au fichiers out.* par hasard?
j'ai essayé ça sans résultat :
Code :
|
Marsh Posté le 19-06-2003 à 11:45:14
bon en fait après lecture de man find, ça serait plutôt ça :
Code :
|
mais ça marche toujours pô, faut-il spécifier deux fois -path?
l'erreur est la suivante :
./spamreport: /var/spool/filter/report.txt: Aucun fichier ou répertoire de ce type
et elle survient à cette ligne :
Code :
|
ce qui veux dire que le fichier report.txt n'a pas été crée.
Marsh Posté le 19-06-2003 à 12:43:54
ben je sais pas, t'as les droits d'écriture dans /var/spool/filter ?
Marsh Posté le 19-06-2003 à 12:45:54
bah ouais je teste en root.
et puis avec l'autre version du script (avec le for) ça marche nickel, j'comprends pô.
même qd je fais
Code :
|
ça renvois rien...
c'est bien comme ça qu'on passe le path?
Marsh Posté le 19-06-2003 à 12:57:34
Code :
|
Marsh Posté le 19-06-2003 à 22:40:25
bon come la directive -path ne marche pô j'ai "rusé" :
Code :
|
comme ça, ça marche
par contre qd je lance le script, il m'affiche tout le contenu des mails dans la console... y'a pas un mode -quiet? (en même temps j'men fous car le script est lancé avec cron mais c'est pas clean)
autre question (et pis après c'est fini), j'trouve pas comment on écrit au début d'un fichier? ça doit être un truc avec l'opérateur > mais une recherche dans google c'est pô facile...
Marsh Posté le 20-06-2003 à 09:52:28
en fait non ça ne marche pô, enfin partiellement
voici mon script simplifié :
Code :
|
les problèmes sont les suivants :
il ne fait pas le mv
donc à chaque que je lance le script, il retraite tous les fichiers
donc echo ls out.* | grep -c reported >> report.txt renvoie 0 (ça c'est pas très grave)
et en plus quand je lance le script il me sort le contenu des mails dans la console
rectification :
il ne fait ni le mv ni la seconde commande cat, en fait c'est comme si il ne faisait que ça :
Code :
|
Marsh Posté le 04-09-2015 à 21:34:28
Bonjour
Code :
|
Cette commande ne renverra que la première occurence de "aaa"
Le commutateur
--max-count=X |
correspond à
-m X |
Marsh Posté le 04-09-2015 à 21:43:28
up de 12 ans, surement un record
Marsh Posté le 18-06-2003 à 11:06:43
Salut,
En complément de spamassassin, qui est pour rappel un progamme qui filtre les spams et que j'ai réglé pour stocker les spams dans un répertoire nommé /var/spool/spam, j'ai écrit une petite ligne de commande qui extrait les lignes Subject des fichier stockés et les ajoute à un rapport (pour faciliter la vérification):
cat out.* | grep 'Subject:' > report.txt
le problème c'est que dans chaque fichier out. la ligne Subject: apparait 2 fois.
Comment faire donc pour n'écrire que la première occurence?
au passage, si quelqu'un sait comment faire pour ajouter le nom du fichier dans le rapport, je suis preneur...