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 № 1To 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