2012-06-12 18 views
7

Ich habe eine Datei wie diese eine mit dem Namen email.txt:vorbei grep in eine Variable in bash

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

this is third test 

Ich möchte mithilfe von bash in dieser Datei Adresse nur die E-Mail nehmen script.So ich dieses setzen Skript in meinem bash-Skript myscript genannt:

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

Aber ich konnte diese script.When ich diesen Befehl manuell in bash laufen laufen ich die E-Mail-Adresse erhalten:

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

Ich muss die E-Mail-Adresse in eine Variable speichern, damit ich sie in anderer Funktion verwenden kann. Kann mir jemand zeigen, wie ich dieses Problem lösen kann? Danke.

+0

Haben Sie versucht, 'Echo file' $ sicher' machen myscript' wirklich den Inhalt von email.txt zurückkehrt? – flesk

+0

@flesk yup..Ich habe das schon gemacht. Die $ Datei hat die genaue Zeile und Inhalt, die ich grep und es kann ohne Problem echo –

+0

Falls die 'From:' Zeile ist nicht in Zeile 2: 'awk -F: '$ 1 == "Von" {print $ 2; exit} '"$ file" ' –

Antwort

10

Ich denke, dies ist eine allzu komplizierte Art und Weise ist, über Dinge zu gehen, aber wenn Sie nur Ihr Skript erhalten wollen zu arbeiten, versuchen Sie dies:

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

Ich bin mir nicht sicher, was file=$(myscript) war sollte, aber in der nächsten Zeile möchten Sie einen Dateinamen als Argument awk, so sollten Sie nur email.txt als Zeichenfolge Wert zu file zuweisen, führen Sie nicht einen Befehl mit dem Namen myscript. $var1 ist kein Befehl (es ist nur eine Zeile aus Ihrer Textdatei), also müssen Sie geben, um grep etwas nützliches zu geben, mit zu arbeiten. Die zusätzlichen Klammern um grep sind redundant.

+0

bei der Verwendung dieser Lösung gibt es mir keinen Fehler, aber es gibt mir auch keine Ausgabe, wenn ich echo $ var2 bin –

+0

@ newbie.my: doppelte Anführungszeichen um '$ var1' hinzugefügt. – flesk

+0

Ich war so dumm.Ihre Lösung funktioniert. Weil ich verschiedene Variable in meiner Maschine verwende, so sollte der Variablenname geändert werden.Anyway thanks for the code! –

9

Was geschieht, ist dies:

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

Sie brauchen so etwas wie dies zu tun:

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

oder sogar

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

Diese Antwort ist auch korrekt.Mit ordentlicherem Schritt. Danke! –

0

Es gibt sehr hilfreich Flaggen für bash: - xv

Die Zeile mit

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

sollte

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

auch meine Version von grep nicht -o-Flag hat.

Und soweit Grep-Muster "gierig" sind, auch wenn der folgende Code ausgeführt wird, ist die Ausgabe nicht genau das, was Sie wollen.

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

Ich habe schon versucht Sie Lösung.Aber es funktioniert nicht.Und übrigens meine Grep haben -o Flagge.Es ist für Show nur übereinstimmenden Teil mit dem Muster –

0

Verwenden Bash parameter expansion,

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

Dies ist keine Befehlssubstitution, Befehlsersetzung ist $ (Befehl). Was Sie gezeigt haben, ist eine Form der Parametererweiterung (es gibt viele). Sie entfernen die kürzeste Zeichenfolge links in ':' – cdarke

+0

@cdarke: ja. + 1 –

0

Es gibt eine gröbere Art und Weise:

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

Das heißt, extrahieren Sie die Zeile [s] mit @ Zeichen, drehen Sie die spitzen Klammern in Zeilenumbrüche, dann grep wieder für alles, was mit einem @ -Zeichen übrig ist.

Verfeinern nach Bedarf ...