2011-11-12 20 views
83

El uso de este:Grep caracteres antes y después del partido?

grep -A1 -B1 "test_pattern" file 

producirá una línea antes y después de patrón emparejado en el archivo. ¿Hay alguna forma de mostrar líneas no pero un número específico de caracteres?

Las líneas en mi archivo son bastante grandes, así que no estoy interesado en imprimir toda la línea, sino que solo observo la coincidencia en contexto. ¿Alguna sugerencia sobre cómo hacer esto?

Respuesta

103

3 caracteres antes y después de 4 caracteres

$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}' 
23_string_and 
+4

Una buena respuesta para pequeñas cantidades de datos, pero comienza a ser lenta cuando se combinan> 100 caracteres, p. Ej. en mi archivo xml gigante, quiero {1,200} antes y después, y es demasiado lento para usar. – Benubird

+3

La versión awk de @amit_g es mucho más rápida. – ssobczak

+1

No está disponible en Mac OSX, así que realmente esta no es una solución ampliamente disponible. La versión -E (enumerada a continuación) es una mejor solución. ¿Qué es -P? Siga leyendo ... -P, --perl-regexp Interprete PATTERN como una expresión regular de Perl (PCRE, consulte a continuación). Esto es altamente experimental y grep -P puede advertir sobre las características no implementadas. – Xofo

23

Usted podría utilizar

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

Funciona muy bien incluso con archivos algo más grandes también – Touko

+3

¿cómo se puede utilizar para encontrar varias coincidencias por línea? – koox00

+0

¿Alguien puede actualizar esto para múltiples coincidencias? – Pranab

11

¿Quieres decir, como este:

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

?

Eso imprimirá hasta veinte caracteres a cada lado de test_pattern. La notación \{0,20\} es como *, pero especifica de cero a veinte repeticiones en lugar de cero o más. El -o dice que se muestre solo la coincidencia, en lugar de la línea completa.

+0

Este comando no funciona para mí: 'grep: contenido no válido de \ {\}' –

+0

Este trabajó en el terminal OSX. – hapi

70
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt 

Esto coincidirá con hasta 5 caracteres antes y después de su patrón. El modificador -o le dice a grep que solo muestre la coincidencia y -E para usar una expresión regular extendida. Asegúrese de poner las comillas alrededor de su expresión, de lo contrario podría ser interpretado por el intérprete de comandos.

0

Con gawk, puede utilizar la función de coincidencia:

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 estás bien con perl, la solución más flexible: siguiente imprimirá tres caracteres antes de que el patrón seguido por patrón real y después de 5 caracteres según el modelo .

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

Esto también se puede aplicar a palabras en vez de simplemente characters.Following imprimirá una palabra antes de que la cadena coincidente real.

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

siguiente imprimirá una palabra después de que el patrón:

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

siguiente imprimirá una palabra antes de que el patrón, entonces la palabra real y luego una palabra después de que el patrón:

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