2012-06-12 18 views
7

tengo un archivo llamado email.txt como estos uno:pasar grep en una variable en bash

Subject:My test 
From:my email <[email protected]> 

this is third test 

quiero sólo para llevar la dirección de correo electrónico en este archivo mediante el uso de fiesta script.So pongo esto guión en mi escritura del golpe nombrado miscript:

#!/bin/bash 

file=$(myscript) 

var1=$(awk 'NR==2' $file) 

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b')) 

echo $var2 

Pero no pudo ejecutar este script.When corro este comando manualmente en bash puedo obtener la dirección de correo electrónico:

echo $var1 | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b' 

Necesito poner la dirección de correo electrónico a almacenar en una variable para que pueda usarla en otra función. ¿Puede alguien mostrarme cómo resolver este problema? Gracias.

+0

¿Has probado 'echo $ file' para asegurarse de que' myscript' realmente devuelve el contenido de email.txt? – flesk

+0

@flesk yup..ya lo he hecho. El archivo $ tiene la línea y el contenido exactos que quiero grep y puede hacer eco sin problema –

+0

En caso de que la línea 'From:' no esté en la línea 2: 'awk -F: '$ 1 == "Desde" {print $ 2; exit} '"$ file" ' –

Respuesta

10

creo que esta es una manera demasiado complicado de hacer las cosas, pero si lo que desea es obtener su escritura para trabajar, probar esto:

#!/bin/bash 

file="email.txt" 

var1=$(awk 'NR==2' $file) 

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 

echo $var2 

No estoy seguro de lo que era file=$(myscript) se supone que debe hacer, pero en la siguiente línea desea un nombre de archivo como argumento en awk, por lo que debe asignar email.txt como un valor de cadena a file, no ejecutar un comando llamado myscript. $var1 no es un comando (es solo una línea de su archivo de texto), por lo que tiene que echo dar grep algo útil para trabajar. Los paréntesis adicionales alrededor de grep son redundantes.

+0

al usar esta solución no me da ningún error PERO tampoco me da salida cuando estoy haciendo eco de $ var2 –

+0

@ newbie.my: se han añadido comillas dobles alrededor de '$ var1'. – flesk

+0

He sido tan tonto. Tu solución está funcionando. Porque estoy usando una variable diferente en mi máquina, así que el nombre de la variable debería cambiarse. De todos modos, ¡gracias por el código! –

9

Lo que ocurre es lo siguiente:

var2=$("$var1" | (grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b')) 
     ^^^^^^^ Execute the program named (what is in variable var1). 

Es necesario hacer algo como esto:

var2=$(echo "$var1" | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 

o incluso

var2=$(awk 'NR==2' $file | grep -Eio '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b') 
+0

Esta respuesta también es correcta. Con un paso más decente. ¡Gracias! –

0

Hay banderas muy útiles para la fiesta: - xv

La línea con

var2=$("$var1" | (grep... 

debería ser

var2=$(echo "$var1" | (grep... 

También mi versión de grep no tiene opción -o.

Y, en cuanto a los patrones grep son "codiciosos" incluso cuando se ejecuta el siguiente código, su salida no es exactamente lo que desea.

#!/bin/bash -xv 
file=test.txt 
var1=$(awk 'NR==2' $file) 

var2=$(echo "$var1" | (grep -Ei '\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,4}\b')) 

echo $var2 
+0

ya le he probado la solución.Pero no funciona.Y por cierto mi grep tiene -o flag.It es para mostrar solo la parte correspondiente con el patrón –

0

Uso Bash parameter expansion,

var2="${var1#*:}" 
+1

Esto no es una sustitución de comando, la sustitución de comando es $ (comando). Lo que has mostrado es una forma de expansión de parámetros (hay muchos). Está eliminando la cadena más corta en el extremo izquierdo en ':' – cdarke

+0

@cdarke: sí. + 1 –

0

Hay una manera más cruda:

archivo $ cat | grep @ | tr '<>' '\ 012 \ 012' | grep @

Es decir, extraiga la línea [s] con signos @, convierta los corchetes angulares en líneas nuevas, luego grep nuevamente para cualquier cosa que quede con un signo @.

Filtrar según sea necesario ...

Cuestiones relacionadas