jak wykonać linie pochodzące z wyniku grep?


10

Mam plik tekstowy z pewnymi instrukcjami instalacji i wiem, że mogę grepować za wyjątkowe wystąpienie w tym pliku. Na przykład plik tekstowy ma coś takiego:

MYDIR = `find / home / user -name somedir`
eksport PERL5LIB = $ PERL5LIB: $ MYDIR

W bash, jak mogę wykonać linie po grep w pliku? Coś jak:

wykonaj wynik z „grep somedir INSTALLFILE”
wykonaj wynik z eksportu „grep” PERL5LIB „INSTALLFILE”

2
Czy automatyczne wykonywanie w ten sposób nie jest zbyt niebezpieczne?
Faheem Mitha

2
@Faheem i @avilella: Bardziej niż nastolatka, raczej niebezpieczne! Również nieco kruche.
Caleb

Odpowiedzi:


4

Założenia:

  • masz kontrolę nad tym plikiem i nie zagraża Ci złośliwy kod
  • chcesz ustawić te zmienne jako bieżącą powłokę

Możesz przekierować swoje polecenia do pliku tymczasowego i wykonać następujące czynności:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

Lub możesz ocenić wyniki

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

Aktualizowanie starej odpowiedzi. Chciałbym dziś użyć substytucji procesu:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

Pamiętaj, że do tego source <(...)potrzebujesz bash 4 lub nowszej. Nie działało ze starszymi wersjami (zsh było OK).
Stéphane Chazelas,

11

Aby ocenić linie w osobnym procesie powłoki:

grep somedir INSTALLFILE | sh

Aby ocenić linie w uruchomionym procesie powłoki:

eval "$(grep somedir INSTALLFILE)"

+1 za to, że jako jedyny widzi las przez drzewa. Niniejszym usuwam moją odpowiedź. @avilella: dla wygody możesz użyć -A 1lub -B 1jako flagi na jednym lub drugim ze swoich, grepaby pobrać obie linie jednym grepem i użyć tego w jednym z rozwiązań @Gilles.
Caleb

Zauważ, że w niektórych systemach shmoże być dowiązanie symboliczne do innej powłoki zamiast tej, której się spodziewałeś, więc wyniki mogą być nieprzewidywalne. Aby być bezpiecznym, grep somedir INSTALLFILE | bash
określ

-2

Czy rozważałeś użycie funkcji „exec” w find jak w:

find somedir -name INSTALLFILE -exec {}\;

Myślę, że OP chce wykonać wyniki, które wracają do grom grep, a nie uruchomić każdy wynik, który wraca z find.
Caleb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.