grep -A 2 -B 3
imprime 2 lignes après la chaîne grep et imprime 3 lignes avant.
grep -C 3
imprime 3 lignes avant et 3 lignes après
Malheureusement, le que grep
j'utilise ne prend pas en charge ces options. Existe-t-il des commandes ou des scripts alternatifs disponibles pour simuler cela? Vous utilisez des scripts sed
/ awk
/ perl
/ shell?
text-processing
grep
awk
perl
Prashant Bhate
la source
la source
-C
interrupteur.GNU > /usr/local
. Les programmes GNU ont beaucoup d'extensions très utiles et sont conçus pour éviter les restrictions arbitraires (mais vous payez cher en taille et parfois en performances). De nombreux systèmes propriétaires ont des référentiels de paquets "non officiels" avec GNU et d'autres outils. Le "partenaire" ne vous en parlera pas, même lorsqu'ils sont gérés par le vendeur ...Réponses:
Une façon modérément laide de le faire est
ou remplacer
-c
par-C NUM
pour lesNUM
lignes de contexte. Cela produira cependant une sortie supplémentaire. (Si vosdiff
supports-u
/-U NUM
, ce sera plus propre.)Si vous
diff
n'avez pas-c
/-C
/-u
, il y a encore des moyens de le faire, mais ils sont assez moche. D'un autre côté, un système quidiff
ne supporte même-c
pas n'a probablement pas Perl non plus.la source
grep -v pattern file | diff -c - file
ack ne nécessite que Perl, et comprend
-A
,-B
et les-C
options qui fonctionnent comme grep de. Il utilise la syntaxe regex de Perl au lieu de grep, et la façon dont il sélectionne les fichiers à rechercher est assez différente. Vous voudrez peut-être essayer l'-f
option lors de son utilisation (qui imprime les fichiers qu'il recherchera sans réellement rechercher quoi que ce soit).Il peut être installé en tant que script unique qui ne nécessite aucun module non central. Déposez-le simplement dans votre
~/bin
répertoire (ou n'importe où ailleurs sur votre PATH auquel vous avez accès en écriture) et assurez-vous qu'il estchmod
exécutable.la source
ack
pour votre propre usage.Ce script perl simple émule
grep -A
dans une certaine mesureNotez que vous pouvez ajouter une déclaration d'utilisation, pour rendre le script lisible et utilisable;)
la source
grep-A 3 foo
semble beaucoup plus naturel quegrep-A foo 3
. :-)Vous pouvez simplement installer GNU grep ou Ack (écrit en Perl, comprend de nombreuses options de GNU grep et plus).
Si vous préférez vous en tenir aux outils standard et à un peu de script, voici un script awk qui émule le comportement des options
-A
et des grep GNU-B
. Peu testé.Exécutez-le comme
grep-ac -vpattern=PATTERN -vbefore=NBEFORE -vafter=NAFTER
oùPATTERN
est le modèle à rechercher (une expression régulière étendue avec quelques ajouts awk ), etNBEFORE
etNAFTER
sont les nombres de lignes à imprimer avant et après une correspondance respectivement (par défaut à 0). Exemple:la source
{ "exec" "awk" "-f" "$0" "$@"; }
: moyen très astucieux de contourner les limites de l'analyse de lignes de shebang.Il s'avère qu'il est assez difficile d'émuler -B, en raison des problèmes qui surviennent lorsque vous avez des lignes correspondantes qui se suivent directement. Cela interdit à peu près toute sorte d'analyse de fichiers à passage unique.
Je l'ai réalisé en jouant avec l'approximation suivante:
Cela fonctionnera à peu près correctement comme le ferait grep -A7 -B3, avec la mise en garde décrite dans le premier paragraphe.
Une solution alternative (également à fichier unique) à ce problème consiste à utiliser perl pour alimenter sed une chaîne de commande:
la source
shift @A if push(@A,$_)>7;
bit ne conserve qu'un tableau de taille maximale 7 autour. (c'est votre paramètre -A). La deuxième option conserve un fichier incroyablement petit (exécutez simplement perl sans la couche externe sed pour voir ce qui y est généré), mais elle lit le fichier deux fois.En utilisant,
sed
vous pouvez d'abord obtenir les numéros de ligne des lignes correspondantes, décrémenter et incrémenter un numéro de ligne donné dans unewhile
boucle, puis utilisersed -n "n1,n2p"
pour imprimer les lignes du contexte de début (n1
) et de fin (n2
) (similaire à l'sed
alternative suggérée par user455). De nombreux processus de lecture peuvent cependant entraîner une baisse des performances.ed
peut référencer directement les lignes précédentes et suivantes d'une ligne correspondante, mais échoue si la plage de lignes spécifiée n'existe pas; par exemple, la ligne correspondante est la ligne numéro 2, mais 5 lignes de pré-correspondance doivent être imprimées. L' utilisation ,ed
il est donc nécessaire d'ajouter un nombre approprié de lignes (vide) au début et à la fin. (Pour les fichiers volumineux, ceed
n'est peut-être pas le bon outil, voir: bfs - scanner de gros fichiers ).la source