it-swarm-eu.dev

Může grep vrátit true / false nebo existují alternativní metody

V rámci tohoto skriptu musím být schopen zkontrolovat, zda se první zadaný argument shoduje s prvním souborem Word. Pokud ano, ukončete chybovou zprávu; pokud tomu tak není, připojte argumenty k souboru. Rozumím, jak napsat příkaz if, ale ne jak používat grep ve skriptu. Chápu, že grep bude vypadat něco takového

grep ^$1 schemas.txt

Mám pocit, že by to mělo být mnohem jednodušší, než to dělám já.

Ve výpisu if se zobrazuje chyba „příliš mnoho argumentů“. Zbavil jsem se prostoru mezi grep -q a pak se očekával binární operátor s chybou.

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "[email protected]" >> schemas.txt
fi
142
Lauren

grep vrátí jiný výstupní kód, pokud našel něco (nula) vs. pokud nenalezl nic (nenulový). V příkazu if je nulový výstupní kód mapován na "true" a nenulový výstupní kód je mapován na false. Kromě toho má grep argument -q, Který nevysílá odpovídající text (ale vrací pouze stavový kód ukončení)

Takže můžete použít grep takto:

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

Jako rychlá poznámka, když uděláte něco jako if [ -z "$var" ]…, Ukáže se, že [ Je ve skutečnosti příkaz, který používáte, stejně jako grep. V mém systému je to /usr/bin/[. (No, technicky, váš Shell má pravděpodobně vestavěný, ale to je optimalizace. Chová se, jako by to byl příkaz). Funguje to stejným způsobem, [ Vrací nulový výstupní kód pro true, nenulový výstupní kód pro false. (test je totéž jako [, s výjimkou závěrečného ])

205
derobert

Dalším jednoduchým způsobem je použití grep -c.

To výstupy (nevracejí se jako výstupní kód), počet řádků, které odpovídají vzoru, takže 0, pokud neexistuje žádná shoda, nebo 1 nebo více, pokud existuje shoda.

Pokud tedy chcete zkontrolovat, zda je vzor shodný 3 nebo vícekrát, měli byste provést následující kroky:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
54
amigal

Vím, že na to přijdu pozdě, ale miluji tuto krátkou verzi:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "[email protected]" >> schemas.txt
7
Denis Pitzalis

Zkuste () místo [], bude fungovat. I když nepoužíváte žádné závorky, kód bude fungovat.

0
Ankit

Pokud chceme zachytit první slovo souboru, musíme přidat -zw grep

if grep -qzw "^$1" file
then 
   ... 
else 
   ... 
fi

Bez -z dostaneme první slovo řádku. Bez -w dostáváme částečná slova.

0
JJoao