2012-06-12 14 views
7

Mam plik o nazwie email.txt takie jak One:przechodząc grep do zmiennej w bash

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

this is third test 

Chcę wykupić tylko adres e-mail, w tym pliku za pomocą bash script.So Ja to skrypt w moim skryptu bash nazwie 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 

Ale nie udało mi się uruchomić ten script.When uruchomić to polecenie ręcznie w bash mogę uzyskać adres e-mail:

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

Potrzebuję umieścić adres e-mail do przechowywania w zmiennej, więc mogę go używać w innej funkcji. Czy ktoś może mi pokazać, jak rozwiązać ten problem? Dzięki.

+0

Czy próbowałeś 'echo $ file' aby upewnić' myscript' naprawdę zwraca zawartość z email.txt? – flesk

+0

@flesk yup..i już to zrobiliśmy. Plik $ ma dokładną linię i treść, którą chcę pobrać i może wywoływać echo bez problemu. –

+0

Jeśli linia 'From:' nie znajduje się w linii 2: 'awk -F: "1 $ ==" Od "{wydrukuj 2 USD; exit} '"$ file" ' –

Odpowiedz

10

myślę, że to jest zbyt skomplikowane do zrobienia o rzeczach, ale jeśli po prostu chcesz, aby uzyskać skrypt do pracy, spróbuj tego:

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

Nie jestem pewien, co było file=$(myscript) ma to zrobić, ale w następnym wierszu chcesz podać nazwę pliku jako argument dla awk, więc powinieneś po prostu przypisać email.txt jako wartość ciągu do file, a nie wykonać polecenia o nazwie myscript. $var1 nie jest poleceniem (jest to tylko linia z pliku tekstowego), więc musisz podać , aby dać grep cokolwiek pożytecznego do pracy. Dodatkowe nawiasy około grep są zbędne.

+0

, kiedy używasz tego rozwiązania, nie daje mi to żadnego błędu, ALE to nie daje mi danych wyjściowych, gdy wysyłam echo $ var2 –

+0

@ newbie.my: Dodano podwójne cudzysłowy wokół '$ var1'. – flesk

+0

Byłem tak głupi. Twoje rozwiązanie działa. Ponieważ używam różnych zmiennych w moim komputerze, więc nazwa zmiennej powinna zostać zmieniona. Zawsze dzięki za kod! –

9

Co dzieje się to w ten sposób:

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

Trzeba zrobić coś takiego:

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

lub nawet

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

Ta odpowiedź jest również poprawna. Z bardziej przyzwoitym krokiem. Dzięki! –

0

Są bardzo pomocne flagi dla bash: - xv

Linia z

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

powinny być

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

Również moja wersja grep nie posiada flagi -o.

A jeśli chodzi o wzorce grep są "zachłanne", mimo że poniższy kod działa, jego wynik nie jest dokładnie tym, czego potrzebujesz.

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

Próbowałem już rozwiązania. Ale to nie działa. A tak na marginesie, mój grep ma -o flag.Jeśli chodzi o pokazanie tylko pasującej części o wzorze –

0

Zastosowanie Bash parameter expansion,

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

Nie jest to podstawienie polecenia, podstawienie polecenia to $ (polecenie). To, co pokazałeś, jest formą rozszerzenia parametrów (jest ich wiele). Usuwasz najkrótszy ciąg po lewej stronie kończąc na ":" – cdarke

+0

@cdarke: yes. + 1 –

0

Jest cruder sposób:

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

Oznacza to, że wyodrębnij linię [s] znakami @, zamień nawiasy klatkowe na znaki nowej linii, a następnie grep na wszystko, co pozostało ze znakiem @.

Refine ile potrzeba ...

Powiązane problemy