Linux: Bloc jusqu'à ce qu'une chaîne est détectée dans un fichier (“queue + grep avec blocage”)
Est-il une ligne de chemin de bash/outils GNU pour bloquer jusqu'à ce qu'il y a une chaîne correspondant à un fichier? Idéalement, avec un délai d'attente. Je veux éviter de multi-ligne de boucle.
Mise à jour: Semble que j'aurais du souligner que je veux le processus à la fin, quand la chaîne est mis en correspondance.
OriginalL'auteur Ondra Žižka | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Grâce à la fois pour les réponses, mais l'important est que le processus se bloque jusqu'à ce trouvé, puis se termine. J'ai trouvé ceci:
-q
n'est pas très portable, mais je n'utilise que Red Hat Enterprise Linux donc c'est ok.Et avec un délai d'attente:
-q
n'est pas portable, c'est spécifiée par POSIX.La page de man pour GNU grep suggère que portable scripts doivent éviter -q, tout simplement parce que certaines anciennes saveurs de Unix ne l'ont pas. Ils suggèrent la redirection vers /dev/null; vous pouvez utiliser
grep -m1 'PATTERN' <(tail -f file.log) >/dev/null
si c'est un souci.Le problème de cette solution est que le processus de "queue" sera encore vivante après grep sortie.
Comment faire pour éviter cela?
OriginalL'auteur
Je fais une variante avec sed au lieu de grep, impression de toutes les lignes analysées.
Le script est en https://gist.github.com/2377029
OriginalL'auteur
Publierons snip avec async délai
Pour l'instant: Comment inclure une minuterie dans des Scripts Bash?
Liés réponse définit un " run_or_timeout la fonction qui fait ce que vous êtes à la recherche d'un très bash-savvy façon
-1
syntaxe est déconseillée, IIRC. Utilisation-n 1
.De cette façon,
tail
ne prend pas fin lorsque la chaîne est trouvée.C'est une surprise pour moi. Aurez besoin de vérifier plus tard
ok...
grep --line-buffered
est une partie de l'équation. Aussi, il apparaît aujourd'hui comme si en cours d'exécution en tête-n0 abandonner sur la ligne suivante après le premier match. J'essaierai plus tardOriginalL'auteur
ou, si vous voulez éviter la sortie de la non-correspondance des lignes:
Un simple d'esprit pour ajouter un délai d'attente est de faire:
(Supprimer les erreurs de la tuer, de sorte que, si le processus se termine
avant l'expiration de ce délai, vous n'obtenez pas le "processus" d'avertissement).
Notez que ce n'est pas du tout robuste, car il est possible que cmd
prendra fin et le pid comte s'enroule autour, et quelques autres
commande aurez un pid par le temps de l'expiration de la minuterie.
Et la dsi dans la deuxième commande me donne 'indéterminé adresse de regex' erreur.
donc, la ligne supplémentaire requis est le même effet que ce que je suis jusqu'à un.t.m. -- j'ai besoin d'être en laissant maintenant
OriginalL'auteur
Prendre un coup d'oeil à la
--max-count
option:Il sortira après la première ligne qui correspond à
PATTERN
.MODIFIER: prendre note de @Karoly de commentaire ci-dessous. Si le
file.log
la vitesse est lente, il est possible que legrep
processus de bloc jusqu'à ce que le contenu supplémentaire est ajoutée au fichier après la mise en correspondance de la ligne.va imprimer la correspondance de la ligne, mais il ne va pas quitter jusqu'à ce que le contenu supplémentaire est ajouté au fichier (même si elle n'a pas un caractère de saut de ligne encore):
Dans certains cas (comme une haute vitesse de fichier journal), ce n'est pas une grosse affaire, parce que le nouveau contenu est probablement va être ajoutée au fichier bientôt de toute façon.
Également noter que ce comportement ne pas se produire lors de la lecture à partir d'une console comme stdin, de sorte qu'il semble être une différence dans la façon
grep
lit à partir d'un tuyau:Oui, c'était une exigence dans la question d'origine: "Bloc jusqu'à ce qu'un string est assorti"... La
-m 1
argument provoque la sortie après le premier match dePATTERN
oui, intuitivement qu'il en doit de travail. malheureusement, d'abord vous avez besoin de plus l'apparition de lignes dans le fichier journal pour déclencher la réelle quitter. tester vous-même. Je vois dans le grep de sortie
PATTERN
mis en évidence, mais le processus ne se termine pas. Note: c'est avec bash, le shell peut-être plus intelligent.En effet, on dirait que vous êtes correct. J'ai été le tester avec quelque chose qui avait une grande vitesse de journaux (android
logcat
, IIRC), donc je n'ai pas remarqué le coup. Je ne sais pas pourquoi grep fonctionne de cette manière, parce que la page de man dit qu'il doit arrêter immédiatement quand il touche le max-comte.OriginalL'auteur
attendre pour le fichier de
attendre de la chaîne d'apper dans le fichier
https://superuser.com/a/743693/129669
OriginalL'auteur
J'ai eu une demande similaire et est venu avec ce qui suit.
Le one-liner, vous êtes après est la ligne qui commence par "délai d'attente ...." et le reste du code est le travail de préparation nécessaire pour fournir le one-liner avec les informations dont il a besoin et à nettoyer après.
J'ai mis en place ci-dessus dans un seul script qui peut être utilisé pour exécuter une commande d'attendre de son fichier de log pour avoir la configuration voulue, avec un délai d'attente.
Disponible ici: run_and_wait.sh
OriginalL'auteur