2009-08-08 23 views
45

Estoy atrapado en intentar grep cualquier cosa después de name=, incluir solo espacios y alfanuméricos.¿Cómo usar grep para obtener algo justo después de `name =`?

ej .:

name=some value here 

me sale

some value here 

estoy totalmente Novato en esto, el siguiente partido grep todo, incluyendo el name=.

grep 'name=.*' filename 

Cualquier ayuda es muy apreciada.

Respuesta

76

Como se detalla here, que desea una cláusula de búsqueda hacia atrás positivas, tales como:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename 

El -P hace grep utilizar el dialecto Perl, de lo contrario lo que probablemente necesita para escapar el paréntesis También puede, como se indica en otra parte, agregar el parámetro -o para imprimir solo lo que coincide. La parte entre paréntesis especifica que desea caracteres alfanuméricos y espacios.

La ventaja de utilizar una cláusula lookbehind positiva es que el texto "name =" no es parte de la coincidencia. Si grep resalta el texto coincidente, solo resaltará la parte alfanumérica (y espacios). El parámetro -o tampoco mostrará la parte "name =". Y, si transfiere esto a otro programa como sed que podría capturar el texto y hacer algo con él, no capturará la parte "name =", aunque también puede hacerlo mediante el uso de paréntesis de captura.

+2

¿grep realmente es compatible con lookbehind positivo? –

+1

Estaba preocupado por eso, también, así que lo probé en mi PC con Windows, y es por eso que tuve que usar el parámetro -P. Probablemente lo apoye en los otros sabores (tal vez no -G), pero yo no sabía el escape adecuado para los elementos. Estoy usando grep 2.5.1. – markets

+0

Lo consigo con grep -P: grep: El soporte para la opción -P no está compilado en este Esto está en Ubuntu Hardy (Linux 2.6.24). En otra máquina Linux falló con un mensaje de error ligeramente diferente, y también en Solaris 10. –

1

grep imprimirá toda la línea donde coincida con el patrón. Para imprimir solo el patrón emparejado, use la opción grep -o. Probablemente también necesitará usar sed para eliminar el nombre = parte del patrón.

grep -o 'name=[0-9a-zA-Z ]' myfile | sed /^name=/d 
+4

Dos procesos para esto es excesivo. Si tiene que usar sed, puede hacerlo solo con eso. –

4

grep no se extrae como usted esperaba. Lo que necesita es

grep "name=" file.txt | cut -d'=' -f1- 
21

Prueba esto:

sed -n 's/^name=//p' filename 

Se le indica a sed de imprimir nada (-n) por defecto, sustituir el prefijo sin nada, e imprimir si se produce la sustitución.

Bonus: si realmente se necesita para que coincida con solamente entradas con sólo espacios y caracteres alfanuméricos, se puede hacer eso también:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename 

Aquí hemos añadido un patrón para que coincida con los espacios y caracteres alfanuméricos sólo hasta el final de la línea ($), y si coincidimos, sustituimos el grupo entre paréntesis e imprimimos.

+0

+1. Simple, elegante, de rendimiento. –

+1

Es muy probable que sea una solución muy adecuada, pero el consultante preguntó acerca de grep ... y no coincide solo con espacios y caracteres alfanuméricos. – markets

+1

Hacer coincidir espacios y alfas es trivial, agregaré algo para eso. En cuanto a solo usar grep, bueno, la respuesta mejor clasificada ahora usa grep AND sed ... al menos esto solo usa un solo proceso. :) –

3

gawk

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

o con golpe

str="name=some value here" 
IFS="=" 
set -- $str 
echo $1  
unset IFS 

o

str="name=some value here" 
str=${str/name=/} 
Cuestiones relacionadas