2012-05-07 11 views
20

Quiero buscar una palabra en varios archivos y devolver solo una línea por resultado, o un número limitado de caracteres (40 ~ 80 caracteres, por ejemplo), y no toda la línea, como por defecto.grep limited characters - one line

grep -sR 'wp-content' . 

file_1.sql:3309:blog/wp-content 
file_1.sql:3509:blog/wp-content 
file_2.sql:309:blog/wp-content 

Actualmente veo lo siguiente:

grep -sR 'wp-content' . 

file_1.sql:3309:blog/wp-content-Progressively predominate impactful systems without resource-leveling best practices. Uniquely maximize virtual channels and inexpensive results. Uniquely procrastinate multifunctional leadership skills without visionary systems. Continually redefine prospective deliverables without. 
file_1.sql:3509:blog/wp-content-Progressively predominate impactful systems without resource-leveling best practices. Uniquely maximize virtual channels and inexpensive results. Uniquely procrastinate multifunctional leadership skills without visionary systems. Continually redefine prospective deliverables without. 
file_2.sql:309:blog/wp-content-Progressively predominate impactful systems without resource-leveling best practices. Uniquely maximize virtual channels and inexpensive results. Uniquely procrastinate multifunctional leadership skills without visionary systems. Continually redefine prospective deliverables without. 
+0

http://theunixshell.blogspot.in/2012/12/print-first-80-characters-in-line.html – Vijay

Respuesta

17
egrep -Rso '.{0,40}wp-content.{0,40}' *.sh 

Esto no llamará a la Orquesta de la Radio-Sinfonía, pero -o (nima coincidencia).

Un máximo de 40 caracteres antes y después de su patrón. Nota: * e * grep.

+0

Funciona muy bien, gracias. –

+1

'egrep' ahora está en desuso. Use 'grep -E' en su lugar. – ruuter

+0

@ruuter: En mi Linux reciente (xubuntu 15.10), egrep es 'exec grep -E" $ @ "'. AFAIK este es el caso por un largo tiempo. –

4

Si cambia la expresión regular a '^.*wp-content' puede utilizar egrep -o. Por ejemplo,

egrep -sRo '^.*wp-content' . 

La bandera -o hacen egrep solamente imprima la porción de la línea que coincide. Por lo tanto, la coincidencia desde el inicio de la línea hasta el wp-content debe producir la salida de muestra en su primer bloque de código.

+0

Puede que no haya entendido correctamente el comando, pero no funcionó, él sigue enumerando el mismo camino. –

+0

Si su contenido es el que tiene en su ejemplo, debería generar todo hasta 'wp-content', y nada más. Esa debería ser la misma salida en su primer bloque de código. Sin embargo, a juzgar por las otras respuestas, eso puede ser o no lo que realmente quieres. –

+0

@PatrickMaciel Vea mis cambios. Expandí mi explicación de la bandera '-o'. –

16

Se puede usar una combinación de grep y cortar

Usando su ejemplo me gustaría utilizar:

grep -sRn 'wp-content' .|cut -c -40 
grep -sRn 'wp-content' .|cut -c -80 

Eso le daría los primeros 40 o 80 caracteres respectivamente.

edición:

Además, hay un indicador en grep, que se puede utilizar:

-m NUM, --max-count=NUM 
      Stop reading a file after NUM matching lines. 

Este con una combinación de lo que escribí anteriormente:

grep -sRnm 1 'wp-content' .|cut -c -40 
grep -sRnm 1 'wp-content' .|cut -c -80 

que debe dar la primera vez que aparece por archivo, y solo los primeros 40 u 80 caracteres.

+0

Realmente prefiero esta opción ya que no necesita modificar su expresión regular. –