2012-06-12 22 views
7

Ho un file chiamato email.txt come questi uno:passando grep in una variabile in bash

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

this is third test 

voglio prendere solo l'indirizzo e-mail in questo file utilizzando bash script.So ho messo questo scritto nel mio script bash chiamato MyScript:

#!/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 

Ma non è riuscito a eseguire questo script.When ho eseguito questo comando manualmente in bash posso ottenere l'indirizzo e-mail:

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

Ho bisogno di mettere l'indirizzo di posta elettronica per memorizzare in una variabile in modo da poterlo usare in un'altra funzione. Qualcuno mi mostra come risolvere questo problema? Grazie.

+0

Hai provato 'echo $ file' per assicurarsi' myscript' davvero restituisce il contenuto da email.txt? – flesk

+0

@flesk yup..ho già fatto. Il file $ ha la riga esatta e il contenuto che voglio grep e può echo senza problemi –

+0

Nel caso in cui la riga 'From:' non sia sulla linea 2: 'awk -F: '$ 1 == "Da" {stampa $ 2; exit} '"$ file" ' –

risposta

10

credo che questo sia un modo troppo complicato per fare le cose, ma se si desidera solo per ottenere lo script di lavorare, provate questo:

#!/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 

Non sono sicuro di quello che è stato file=$(myscript) dovrebbe fare, ma nella riga successiva si desidera un nome di file come argomento a awk, quindi è sufficiente assegnare email.txt come valore di stringa a file, non eseguire un comando chiamato myscript. $var1 non è un comando (è solo una riga del tuo file di testo), quindi devi echo dare a grep qualcosa di utile con cui lavorare. Le parentesi aggiuntive intorno a grep sono ridondanti.

+0

quando si usa questa soluzione non mi dà alcun errore MA non mi dà nemmeno l'output quando echo $ var2 –

+0

@ newbie.my: aggiunte doppie virgolette su '$ var1'. – flesk

+0

sono stato così sciocco. La tua soluzione funziona. Perché sto usando una variabile diversa nella mia macchina, quindi il nome della variabile dovrebbe essere cambiato. Comunque grazie per il codice! –

9

Quello che sta accadendo è questo:

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). 

Hai bisogno di fare qualcosa di simile:

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

o anche

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

Anche questa risposta è corretta.Con passo più decente. Grazie! –

0

ci sono molto utili bandiere per bash: - xv

La riga con

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

dovrebbe essere

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

anche la mia versione di grep non ha bandiera -o.

E, per quanto i modelli di grep siano "golosi", anche quando viene eseguito il codice seguente, l'output non è esattamente quello che si desidera.

#!/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

ho già provato la soluzione. Ma non funziona. E a proposito il mio grep ha -o flag.Esso per mostrare solo la parte corrispondente al modello –

0

Usa Bash parameter expansion,

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

Questa non è una sostituzione di comando, la sostituzione di comando è $ (comando). Quello che hai mostrato è una forma di espansione dei parametri (ce ne sono molti). Stai rimuovendo la stringa più breve a sinistra che termina con ":" – cdarke

+0

@cdarke: sì. + 1 –

0

C'è un modo più crudo:

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

Cioè, estrai la linea [s] con i simboli @, gira le parentesi angolari in nuove linee, quindi esegui nuovamente il grep per tutto ciò che rimane con un segno @.

Perfeziona se necessario ...

Problemi correlati