J'ai une application qui produira une grande quantité de données que je ne souhaite pas stocker sur le disque. L'application génère principalement des données que je ne souhaite pas utiliser, mais un ensemble d'informations utiles qui doivent être divisées en fichiers séparés. Par exemple, étant donné la sortie suivante:
JUNK
JUNK
JUNK
JUNK
A 1
JUNK
B 5
C 1
JUNK
Je pourrais exécuter l'application trois fois comme ceci:
./app | grep A > A.out
./app | grep B > B.out
./app | grep C > C.out
Cela m'obtiendrait ce que je veux, mais cela prendrait trop de temps. Je ne veux pas non plus sauvegarder toutes les sorties dans un seul fichier et les analyser.
Existe-t-il un moyen de combiner les trois opérations illustrées ci-dessus de telle manière que je n'ai besoin d'exécuter l'application qu'une seule fois et d'obtenir toujours trois fichiers de sortie distincts?
./app | tee >(grep A > A.out) >(grep B > B.out) | grep C > C.out
grep
.Vous pouvez utiliser
awk
la source
Vous pouvez également utiliser les capacités de correspondance de motifs de votre coque :
Ou même:
Un moyen plus sûr qui peut gérer les barres obliques inverses et les lignes commençant par
-
:Comme le souligne @StephaneChazelas dans les commentaires, ce n'est pas très efficace. La meilleure solution est probablement @ AurélienOoms ' .
la source
-n
,-e
... Cela va également être terriblement inefficace car cela signifie plusieurs appels système par ligne (unread(2)
par caractère, le fichier étant ouvert, l'écriture fermé pour chaque ligne ...). En règle générale, l'utilisation dewhile read
boucles pour traiter du texte dans des shells est une mauvaise pratique.-n
etc. maintenant. Pour autant que je sache, les deux versions fonctionnent bien avec des blancs, ai-je tort?printf
est le format. Il n'y a aucune raison de vous laisser des variables sans guillemets là-dedans.Si vous avez plusieurs cœurs et que vous souhaitez que les processus soient en parallèle, vous pouvez faire:
Cela engendrera trois processus dans des cœurs parallèles. Si vous voulez qu'il y ait une sortie vers la console, ou un fichier maître, cela a l'avantage de garder la sortie dans un certain ordre, plutôt que de la mélanger.
L'utilitaire gnu parallèle d'Ole Tange peut être obtenu auprès de la plupart des dépôts sous le nom parallèle ou moreutils . La source peut être obtenue sur Savannah.gnu.org . Une vidéo d'introduction est également disponible ici .
Addenda
En utilisant la version la plus récente de Parallel (pas nécessairement la version de votre référentiel de distribution), vous pouvez utiliser la construction la plus élégante:
Ce qui permet d'obtenir le résultat d'exécuter un ./app et 3 processus grep parallèles dans des cœurs ou des threads séparés (comme déterminé par parallèle lui-même, considérez également le -j3 comme facultatif, mais il est fourni dans cet exemple à des fins instructives).
La nouvelle version de Parallel peut être obtenue en faisant:
Ensuite, décompressez d'habitude, cd vers parallel- {date}, ./configure && make, sudo make install. Ceci installera parallèle, page de manuel parallèle et page de manuel parallel_tutorial.
la source
En voici un en Perl:
la source
... if
<in
est lisible, les trois fichiers de sortie seront tronqués avant que quoi que ce soit ne leur soit écrit.la source