Caractères Grep avant et après le match?

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 les lignes mais un nombre de caractères spécifié?

Les lignes de mon fichier sont assez volumineuses, je ne suis donc pas intéressé par l’impression de la ligne entière mais plutôt d’observer la correspondance dans son contexte. Des suggestions sur la façon de procéder?

3 caractères avant et 4 caractères après

 $> echo "some123_ssortingng_and_another" | grep -o -P '.{0,3}ssortingng.{0,4}' 23_ssortingng_and 
 grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

Cela correspondra à 5 caractères avant et après votre modèle. L’option -o indique à grep de ne montrer que la correspondance et -E d’utiliser une expression régulière étendue. Assurez-vous de mettre les guillemets autour de votre expression, sinon cela pourrait être interprété par le shell.

Vous pourriez utiliser

 awk '/test_pattern/ { match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20); }' file 

Tu veux dire comme cela:

 grep -o '.\{0,20\}test_pattern.\{0,20\}' file 

?

Cela imprimera jusqu’à vingt caractères de chaque côté de test_pattern . La notation \{0,20\} est comme * , mais spécifie zéro à vingt répétitions au lieu de zéro ou plus.

Avec gawk , vous pouvez utiliser la fonction de correspondance:

  x="hey there how are you" echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}' ere are 

Si vous êtes d’accord avec perl , une solution plus flexible: La suite imprimera trois caractères avant le motif, suivis du motif actuel, puis de 5 caractères après le motif.

 echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/' ey there how 

Cela peut également être appliqué aux mots au lieu de simplement les caractères. Suivant va imprimer un mot avant la chaîne correspondante.

 echo hey there how are you |perl -lne 'print $1 if /(\w+) there/' hey 

Ce qui suit imprimera un mot après le motif:

 echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/' how 

La suite imprimera un mot avant le motif, puis le mot réel et un mot après le motif:

 echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/' hey there how