En utilisant ceci:
grep -A1 -B1 "test_pattern" file
produira une ligne avant et après le motif correspondant dans le fichier. Existe-t-il un moyen d'afficher non pas des lignes mais un nombre spécifié de caractères?
Les lignes de mon fichier sont assez grandes, donc je ne suis pas intéressé par l'impression de la ligne entière, mais plutôt par l'observation de la correspondance dans son contexte. Des suggestions sur la façon de procéder?
Réponses:
3 caractères avant et 4 caractères après
la source
brew install homebrew/dupes/grep
et exécutez-le en tant queggrep
.Cela correspondra à jusqu'à 5 caractères avant et après votre modèle. Le commutateur -o indique à grep de n'afficher que la correspondance et -E d'utiliser une expression régulière étendue. Assurez-vous de mettre les guillemets autour de votre expression, sinon elle pourrait être interprétée par le shell.
la source
{0,255}
marche{0,256}
donnegrep: invalid repetition count(s)
Vous pourriez utiliser
la source
Tu veux dire comme cela:
?
Cela imprimera jusqu'à vingt caractères de chaque côté de
test_pattern
. La\{0,20\}
notation est similaire*
, mais spécifie de zéro à vingt répétitions au lieu de zéro ou plus. Elle-o
indique de n'afficher que la correspondance elle-même, plutôt que la ligne entière.la source
grep: Invalid content of \{\}
Avec
gawk
, vous pouvez utiliser la fonction de correspondance:Si vous êtes d'accord avec
perl
une solution plus flexible: ce qui suit imprimera trois caractères avant le motif suivi du motif réel, puis 5 caractères après le motif.Cela peut également être appliqué à des mots au lieu de seulement des caractères. La suite imprimera un mot avant la chaîne correspondante.
Ce qui suit imprimera un mot après le motif:
Ce qui suit imprimera un mot avant le motif, puis le mot réel, puis un mot après le motif:
la source
Vous pouvez utiliser regexp grep pour trouver + second grep pour surligner
23_string_and
la source
Je ne me souviendrai jamais facilement de ces modificateurs de commandes cryptiques, alors j'ai pris la réponse principale et l' ai transformée en une fonction dans mon
~/.bashrc
fichier:Voici à quoi cela ressemble en action:
Le fichier en question est une ligne continue de 25K et il est impossible de trouver ce que vous recherchez en utilisant regular
grep
.Notez les deux manières différentes d'appeler
cgrep
cettegrep
méthode parallèles .Il existe une manière plus "nift" de créer la fonction où "$ 2" n'est passé que lorsqu'il est défini, ce qui permettrait d'économiser 4 lignes de code. Je ne l'ai pas sous la main. Quelque chose comme
${parm2} $parm2
. Si je le trouve, je réviserai la fonction et cette réponse.la source