Je dois rechercher dans nos journaux de messagerie une adresse e-mail spécifique. Nous conservons un fichier actuel nommé maillog ainsi qu'une valeur d'une semaine de fichiers .bz2 dans le même dossier. Actuellement, j'exécute les commandes suivantes pour rechercher le fichier:
grep person@domain.com maillog
bzgrep person@domain.com *.bz2
Existe-t-il un moyen de combiner les commandes grep
et bzgrep
en une seule sortie? De cette façon, je pouvais diriger les résultats combinés vers un seul e-mail ou un seul fichier.
()
place de{}
?()
mais pas{}
, dans tous les cas +1 car c'est ce dont j'avais besoin!bzgrep utilise automatiquement par défaut grep si un fichier n'est pas compressé en bzip. Ainsi, les éléments suivants devraient être suffisants:
oh bien sûr, voici aussi ma solution obligatoire GNU Parallel :
ce qui pourrait être beaucoup plus rapide si vous vérifiez beaucoup de fichiers.
la source
Voici une autre façon de le faire (en supposant que vous exécutez bash, ce que vous êtes probablement):
Ici bash alimente de manière transparente la sortie des commandes bzgrep et grep dans cat comme s'il s'agissait de fichiers (et ils sont en quelque sorte sous le capot, les détails dans l'url en bas).
Dans votre cas particulier, je recommanderais la solution de Phil, mais ce qui précède est une bonne astuce à garder dans votre sac.
Si vous êtes intéressé, vous pouvez en savoir plus ici: http://www.tldp.org/LDP/abs/html/process-sub.html
la source
Au moment où j'écris ceci, la syntaxe de la réponse acceptée était incorrecte pour la plupart, sinon la totalité, des shells dérivés de Bourne, y compris
bash
. J'ai suggéré une modification en haut et accepté la réponse pour résoudre ce problème, mais j'étais également enclin à ajouter toutes ces autres informations, et cela aurait plutôt été une réécriture plutôt qu'une modification.Vous pouvez utiliser des commandes composées:
..ou sous-coques (notez les parenthèses au lieu des accolades):
..pour regrouper les commandes. La méthode du sous-shell a une syntaxe plus agréable (plus tolérante au manque d'espace blanc et vous permet d'omettre le dernier point-virgule), mais elle bifurque un nouveau processus ou "fait semblant" en exécutant les commandes dans un environnement nettoyé. Les deux ont des avantages en fonction de ce que vous voulez faire, ce qui n'a pas d'importance ici, mais valent la peine d'être recherchés si vous voulez plus de compétences avec le shell.
Remarque: Vous pouvez également utiliser le pipelining avec ces astuces, vous pouvez donc faire quelque chose comme ceci:
PS si vous ne se soucient pas de l'ordre des matches de votre production combinée, vous pouvez utiliser un seul
&
entre les deux commandes, comme suit:{ grep ... & bzgrep ...; }
. Ensuite, les deux commandes s'exécutent simultanément: legrep
se lance et le shell le met en arrière-plan, puis le shell exécutera lebzgrep
. (Mais il y a une petite mise en garde avec cela, l'explication impliquant la redirection de fichiers et la mise en mémoire tampon du flux de fichiers pouvant entraîner une très petite fraction des lignes dans le fichier de sortie à diviser / modifier: si vous verriez cela dépendrait de la façon dont votregrep
,bzgrep
et leslibc
stdio.h
fonctions sont implémentées. Dans la plupart des implémentations, je pense que le fait de canaliser la commande avant de rediriger vers un fichier évitera le problème, vous pouvez donc faire{ foo & bar; } | cat - >file
comme solution de contournement.)la source
Vous pouvez lier les commandes avec && qui vous permettra d'exécuter chaque commande.
vous pouvez également ajouter >> textfile.txt à la fin de chaque commande et faire en sorte que la sortie frappe un fichier, puis l'envoyer par la poste.
la source
grep ... && bzgrep ...
, si grep n'avait pas de résultats, cela retournerait un échec et la commande s'arrêterait.>>
est une bonne idée cependant, contrairement à>
cela, il ajoutera une sortie à la fin d'un fichier existant.