grep duas palavras pesquisadas

0

Eu poderia pesquisar linhas que contenham duas palavras específicas usando o seguinte em vários arquivos:

for f in $(ls *.txt); do
  echo ">"$f; more $f | grep word1 | grep word2
done

Agora, quero escrever um script de shell para fazer isso, de modo que não precise redigitar a coisa toda vez após vez. Eu também queria adicionar uma opção de usar uma palavra ou duas palavras na pesquisa. Eu vou passar essa palavra pesquisada para o shell script na linha de comando. Eu escrevi o seguinte script de shell searchwords.sh:

word1=$1
word2=$2
for f in $(ls *.txt); do
echo ">"$f
###if word2 is empty; then execute 
if [-z $word2]; then
        more $f | grep $word1
else
###if word2 is not empty
        more $f | grep $word1 | grep $word2
fi
done

Uso:

sh searchwords.sh word1 word2

Embora eu tenha o que eu quero, também estou recebendo uma mensagem de erro

[-z: not found

Eu sei que meu código não está certo, mas não consigo colocá-lo.

    
por Jeremy 14.04.2015 / 04:28

1 resposta

1

Existem alguns erros no seu script:

  • Espaço ausente em [-z $word2]
  • Falta de aspas duplas nas variáveis
  • Uso inútil de more | grep
  • A saída de análise de ls está corrompida
  • grep falhará se $word1 ou $word2 começarem com traço -

Aqui está uma correção:

word1=$1
word2=$2

for f in ./*.txt; do
  printf '>%s\n' "$f"

  ###if word2 is empty; then execute 
  if [ -z "$word2" ]; then
    grep -- "$word1" "$f"
  else
  ###if word2 is not empty
    grep -- "$word1" "$f" | grep -- "$word2"
  fi
done
    
por 14.04.2015 / 05:01