O grep pode retornar true / false ou existem métodos alternativos

100

Estou tentando escrever este roteiro para uma tarefa - é apenas o segundo que eu escrevi, então fique comigo.

Como parte desse script, preciso verificar se o primeiro argumento fornecido corresponde à primeira palavra do arquivo. Em caso afirmativo, saia com uma mensagem de erro; se isso não acontecer, anexe os argumentos ao arquivo. Entendo como escrever a instrução if , mas não como usar grep em um script. Eu entendo que grep será algo parecido com isto

grep ^$1 schemas.txt

Eu sinto que isso deve ser muito mais fácil do que eu estou fazendo.

Estou recebendo um erro "muitos argumentos" na instrução if . Eu me livrei do espaço entre grep -q e, em seguida, recebi um operador binário de erro esperado. Eu tenho andado por aí, mas não vejo o que vê.

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi
    
por Lauren 18.09.2012 / 19:33

6 respostas

137

grep retorna um código de saída diferente se encontrar algo (zero) vs. se não encontrou nada (diferente de zero). Em uma instrução if , um código de saída zero é mapeado para "true" e um código de saída diferente de zero é mapeado para false. Além disso, o grep tem um argumento -q para não produzir o texto correspondente (mas apenas retornar o código de status de saída)

Então, você pode usar o grep assim:

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

Como uma observação rápida, quando você faz algo como if [ -z "$var" ]… , verifica-se que [ é na verdade um comando que você está executando, como o grep. No meu sistema, é /usr/bin/[ . (Bem, tecnicamente, seu shell provavelmente tem embutido, mas isso é uma otimização. Ele se comporta como se fosse um comando). Ele funciona da mesma maneira, [ retorna um código de saída zero para true, um código de saída diferente de zero para false. ( test é a mesma coisa que [ , exceto o fechamento ] )

    
por 18.09.2012 / 19:36
37

Outra maneira simples é usar grep -c .

Essa saída (não retorna como código de saída), o número de linhas que correspondem ao padrão, então 0 se não houver correspondência ou 1 ou mais se houver uma correspondência.

Então, se você quisesse verificar se o padrão é correspondido 3 ou mais vezes, você faria:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
    
por 29.04.2013 / 12:19
2

Eu sei que estou atrasado para isso, mas eu amo essa versão curta:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
    
por 05.06.2018 / 17:48
0

Try () em vez de [] funcionará. Mesmo se você não usar colchetes, o código funcionará.

    
por 31.12.2015 / 10:45
0

Se quisermos pegar a primeira palavra de um arquivo, precisamos adicionar -zw ao grep

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

Sem -z , obtemos a primeira palavra de uma linha. Sem -w , obtemos palavras parciais.

    
por 03.06.2018 / 11:37
-1

Se você quiser usá-lo com colchetes, você pode executar o seguinte

if [ 'grep -q PATTERN file.txt' ]; then
    echo found
else
    echo not found

Esta Lógica funciona para todos os comandos, Basta colocar os seus comandos dentro do backtick (o botão acima do separador ou para baixo do botão Esc ou para a esquerda do botão 1)

    
por 24.08.2016 / 14:51

Tags