grep: não é um sinalizador reconhecido no AIX

3

Estou tentando gravar um shell que buscará um conjunto de dados da tabela e o gravará em um arquivo de texto cujo nome é result.txt . Agora vou escolher cada linha deste arquivo e procurá-lo em um arquivo de log e verificar se ele está presente ou não. Se não for encontrado no arquivo de log, desejo gravá-lo em um arquivo separado, digamos notfound.txt . Eu estou trabalhando em um servidor AIX e obtendo este erro abaixo para o comando grep . Alguém pode me ajudar a descobrir o que há de errado?

Aqui está o meu script,

while read -r LINE; do
    grep -q "$LINE" log.log 
    if [  $? -eq 0 ]
    then
       echo "$LINE" >> /home/notfound.txt
    fi
done  < result.txt

que me dá a seguinte saída,

grep: Not a recognized flag: - Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] -e pattern_list... [-f pattern_file...] [file...]

Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-e pattern_list...] -f pattern_file... [file...]

Usage: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] pattern_list [file...]

    
por Preeti Maurya 18.08.2016 / 06:26

1 resposta

7

Parece que $LINE contém um valor que começa com um traço.

Você pode proteger contra isso com

grep -q -e "$LINE"

Mais geralmente, a maioria dos comandos Unix permite que -- marque o fim das opções, e assim qualquer argumento após essa opção "fim de opções" será considerado como um argumento literal, sem opção.

echo terá um problema também; a solução portátil é mudar para printf , que funciona bem com argumentos que começam com traços, desde que não seja o primeiro argumento, que é uma string de formato.

Você também deve evitar usar nomes de variáveis maiúsculas; estes são reservados para uso do sistema.

Por fim, os scripts quase nunca precisam examinar explicitamente $? - isso já é feito por if , while e outras construções de controle.

if grep -q -e "$line" log.log; then
    printf '%s\n' "$line"
fi

Como uma otimização, colocar o redirecionamento fora do loop tornará as coisas muito mais rápidas.

while read -r line; do
    grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt
    
por 18.08.2016 / 06:34