Line feed w wynikach skryptu powłoki za pomocą polecenia grep

1

Piszę skrypt powłoki do grep coś z pliku dziennika, a następnie wydrukuj wszystkie wyniki za pomocą echo dowództwo.

Mogę to zrobić, ale załóżmy, że dziennik zawiera więcej niż 1 wystąpienie szukanego ciągu, a następnie wypisuje wszystkie wyniki w jednym wierszu. Czy możliwe jest wydrukowanie wyników za pomocą linii; jeśli po prostu wykonam grep Polecenie w powłoce spowoduje wydrukowanie go za pomocą wiersza polecenia, więc pomyślałem, że również skrypt powłoki będzie działał w ten sam sposób, ale oczywiście tak się nie dzieje.

Moje skrypty:

#!/bin/bash
messageStr='a senior leader of '$2
echo $messageStr
results=`grep "$messageStr" $1`
echo "results= " $results

Mój plik dziennika:

A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women.

a senior leader of Aam Aadmi Party or AAP

A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women.

Aktualne wyniki:

results=  A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women. a senior leader of Aam Aadmi Party or AAP

Oczekiwane rezultaty:

results=  A column written for ndtv.com by Ashutosh, a senior leader of Aam Aadmi Party or AAP, triggered protests from the opposition today and an order to appear before the country's top women's rights body, which said he has demeaned women. 
a senior leader of Aam Aadmi Party or AAP

Daj mi znać, jeśli wymagane są inne informacje.

hagrawal
źródło

Odpowiedzi:

1

Zmienne niecytowane są poddawane dzieleniu wyrazów (po rozszerzeniu parametru powłoki, spacje, tabulatory i znaki nowej linii są używane do rozdzielenia rozszerzonej zmiennej na oddzielne argumenty) i globbing (rozszerzenie symboli wieloznacznych powłoki). Z reguły powinieneś zawsze cudzysłów zmienne powłoki chyba że specjalnie chcesz podzielić słowo i / lub globbing. Aby uzyskać więcej informacji, zobacz http://mywiki.wooledge.org/Quotes

Jeśli dobrze rozumiem twoje pytanie, w tym przypadku musisz tylko zacytować $results parametr:

messageStr="a senior leader of $2"
echo "$messageStr"
results=$(grep "$messageStr" "$1")
echo "results=  $results"

Nawiasem mówiąc, używanie back-ticków jest (skutecznie) przestarzałe dla podstawiania poleceń; najlepiej używać $().

Uzupełnienie : http://shellcheck.net/ zapewnia bardzo przydatne informacje zwrotne podczas tworzenia skryptów powłoki (np. podświetlanie niecytowanych zmiennych).

Anthony Geoghegan
źródło
Dzięki, to była bardzo miła odpowiedź z wyjaśnieniem i odniesieniem.
hagrawal
@agrawal jesteś mile widziany. Właśnie edytowałem moją odpowiedź, aby dodać link do bardzo przydatnego narzędzia do sprawdzania powłoki.
Anthony Geoghegan