/ / jak pominąć wyjście grep w instrukcji warunkowej - macos, bash

jak pominąć grep output w instrukcji warunkowej - macos, bash

Na komputerze Mac chcę ustalić, czy istnieją jakieś stwierdzenia dotyczące snu za pomocą pmset. Jeśli tak, wyodrębnij tylko te informacje i pomiń niepotrzebne informacje.

Jeśli grep nic nie zwraca, chcę wydrukować „Nic”.

if pmset -g | grep pre ; then pmset -g | grep pre | cut -d"(" -f2 | cut -d")" -f1 ; else printf "Nothingn" ; fi

Problem polega na tym, że drukowany jest pierwszy wynik grep, podobnie jak sformatowany. Na przykład to, co otrzymuję, jeśli trwa tworzenie kopii zapasowej:

spać 15 (sen zabezpieczony przez backupd)

kopia zapasowa zapobiega senowi

Nie chcę pierwszej linii i chcę ją odrzucić. Chcę tylko wydrukować drugą linię („sen wstrzymany przez backupd”).

Jeśli wynik grep jest pusty, chcę to zaznaczyć za pomocą tekstu „Nic”. Powyższy skrypt działa w tym celu OK.

Prawdopodobnie istnieje wiele bardziej eleganckich rozwiązań, ale szukałem dni na jeden.

Odpowiedzi:

0 dla odpowiedzi № 1

To może trochę bardziej zwięzłe. Robi się grep aby wyświetlać tylko część linii, która pasuje do wzorca zamiast całej linii, za pomocą grep -o:

#!/bin/bash
SLEEP=$(pmset -g | grep -o "sleep prevented.*[^)]")
if [ -z "$SLEEP" ]; then
echo Nothing
else
echo $SLEEP
fi

Wzór jest sleep prevented i dowolne znaki następujące po a ) napotkano.


3 dla odpowiedzi № 2

Jeśli dobrze rozumiem twoje pytanie, po prostu musisz odrzucić wynik pierwszego grep bez względu na dostarczaną moc wyjściową. Jeśli tak, możesz użyć -q opcja dostarczona przez grep.

Ze strony podręcznika „grep”:

-q, --quiet, --silent
Quiet; do not write anything to standard output.  Exit immediately with zero status if any match  is  found,  even  if  an  error  was
detected.  Also see the -s or --no-messages option.  (-q is specified by POSIX.)

Coś takiego:

if ifconfig | grep -q X; then
ifconfig | grep Mi | cut -d"(" -f2
else
printf "Nothingn"
fi


Oczywiście w powyższym przykładzie wyjście ifconfig nie zmieni się za każdym razem. Po prostu użyty jako przykład. ;)


1 dla odpowiedzi nr 3

Przekieruj wyjście do /dev/null:

if pmset -g | grep pre >/dev/null 2>&1 ; then
pmset -g | grep pre | cut -d"(" -f2 | cut -d")" -f1
else
printf "Nothingn"
fi