Comando Find não está funcionando no shell script

0

Eu tenho um para encontrar a lista de palavras em uma lista de arquivos. Daí eu coloquei a lista de palavras em um arquivo, e usando for loop tentando ler cada palavra em um arquivo e use o comando find para grep para aquela palavra na lista de arquivos encontrados.

Estou usando o sabor mencionado do Linux

bash-3.1$ uname
HP-UX

O abaixo mencionado é o meu script de shell.

  #!/bin/sh
PATH="/NO/20171013"
STRING='/usr/bin/cat /home/test/STAT44_test.txt'
for LINE in ${STRING}
do
  echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l"
  LINES='find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l'
  echo "LINES count is ${LINES}"
  if [ ${LINES} -eq 0 ]
  then
        echo "In not found"
#       echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out
  else
        echo "In Found"
#       echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out
  fi
done

O comando de localização find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null funciona perfeitamente no prompt de comando, enquanto não está dando saída, se usado no script de shell como mencionado acima.

A saída de echo $? é 0, mas o comando find não produz saída.

A saída do script é

find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found
find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l
LINES count is 0
In not found

Na verdade, os arquivos *.txt em /NO/20171013 possuem arquivos com o padrão 655044810645 e 734729751028 . Portanto, o Word count não deve ser 0 e precisa entrar em else part.

O que poderia estar faltando?

    
por sabarish jackson 16.10.2017 / 10:38

2 respostas

2

Primeiro , configure um $PATH adequado (e veja a resposta de Kamil Maciorowski ):

Faça login com usuário adequado (root?) e execute:

echo PATH=$PATH

Adicione a saída no início do seu script

OU você pode adicionar um caminho completo ao comando find . Se você não sabe onde find são colocados, execute:

which find

A saída será assim: /usr/bin/find

E você tem um erro dentro do loop :

Você precisa substituir aspas simples por doublequotes (em torno de ${LINE} ), caso contrário, a variável não será interpretada:

echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l"
LINES='find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l'

Algumas notas:

  1. Você não precisa de cat file , tente usar o loop. Mas use apenas while , não for ! Leia Por que você não lê as linhas com "para" e Como posso ler um arquivo (fluxo de dados, variável) linha por linha (e / ou campo a campo)?
por 16.10.2017 / 11:26
4

$PATH é variável importante com significado . Você deve escolher outro nome.

Nesse caso, find executável não pode ser encontrado porque $PATH não leva a ele. Você não é notificado por causa de 2>/dev/null .

echo é provavelmente um shell embutido, não precisa de $PATH para funcionar. O mesmo para for etc.

    
por 16.10.2017 / 10:46