Como fazer o grep mesmo que o arquivo não esteja presente?

1

Estou fazendo algo assim no meu código

file_nm='ls -latr *abc*'
if [ 'grep "search_txt" "$file_nm" | wc -l' -gt 0 ]
then
  echo "string found"
else
  echo "string not found"
fi

Se o file_nm for resolvido em branco, meu código trava porque o grep está esperando o file_nm que está em branco. Como posso fazer este código funcionar? Existe alguma opção em grep para ignorar o comando se o arquivo não existir?

    
por janani 28.10.2014 / 17:15

4 respostas

2

Você poderia simplificá-lo de maneira significativa (e evitar os problemas desagradáveis inerentes à análise de ls) fazendo algo como:

file_nm=$(find . -maxdepth 1 -name "*abc*");
[ -e "$file_nm" ] && grep -q "search_txt" "$file_nm" &&
      echo "string found" ||
      echo "string not found"

No entanto, como seu exemplo original, isso falhará se você tiver mais de um arquivo correspondente a *abc* . Então, em vez disso, eu usaria isso:

for i in *abc*; do 
    grep -q "search_txt" "$i" && 
        echo "string found in $i" || 
        echo "string not found in $i"
done 

Se você não se importa com as correspondências em vários arquivos e apenas quer saber se algum dos arquivos correspondentes a *abc* contém a string search_txt , você pode simplesmente fazer

grep -q "search_txt" *abc* &&  echo "string found" || echo "string not found"
    
por 28.10.2014 / 17:33
0

Você deve testar se $file_nm está vazio antes de executar o grep

if [ -n "$file_nn" ];

retornará True se $ file_nm NÃO estiver vazio.

    
por 28.10.2014 / 17:21
0

Tente:

grep "search_txt" /dev/null "$file_nm"

Alimentar /dev/null a grep fará com que funcione mesmo se $file_nm não existir, porque grep sempre tem pelo menos um arquivo - que é /dev/null - para trabalhar.

    
por 28.10.2014 / 17:24
0

Existem vários problemas, incluindo:

  • Seu código postado não é interrompido
  • Você usa o -l flag para ls , o que significa que você procurará arquivos com o nome -rw-r--r-- e tais
  • Você deve evitar analisar a saída de ls

E não há necessidade de testar a saída de grep , você pode usar apenas o status de saída. De man grep :

 EXIT STATUS
       The exit status is 0 if selected lines are found, and 1 if not found.

Aqui está uma versão simplificada que faz a mesma coisa:

if grep -q "search_txt" *abc*
then
  echo "string found"
else
  echo "string not found"
fi
    
por 28.10.2014 / 17:35