Script de contagem de palavras bash

3

Eu tenho este programa que eu quero dizer ao usuário como o tempo que uma palavra inserida pelo usuário aparece em um arquivo. Isto é o que escrevi até agora, mas não funciona.

#! /bin/bash
echo "Enter the file that is to be searched (~/test/new)"
        read location
echo "Enter the search term"
        read search
$result = (grep -w "$search" $location | wc -w)
echo "The search term" $search "appears "$result" time/s in "$location

O que eu posso fazer para dar certo?

    
por S.Jones 14.12.2015 / 18:50

4 respostas

1

O comando do núcleo que você deseja deve, se eu entendi corretamente, conta cada ocorrência da palavra pesquisada. Assumindo o GNU grep:

<"$file" grep -Fwo -- "$word" | wc -l

A opção -F alterna para a correspondência de seqüência de caracteres não-regular e não-regular. %código% faz uma pesquisa de palavras, como na sua pergunta, e -w imprime cada correspondência sozinho, em sua própria linha, resultando na contagem adequada sendo emitida por -o .

Agora, sobre o prompt, você pode aproveitar o fato de que o bash wc -l tem uma opção read :

read -p 'Filename: ' file
read -p 'Word: ' word

A atribuição assume o formato -p , sem sinal de dólar ou espaços ao redor do sinal de igual:

count=$(grep-command)

Finalmente, você pode aproveitar a interpolação de string ao escrever sua saída:

echo "File '$file' contains this many occurrences of '$word': $count."
    
por 14.12.2015 / 19:17
0

Tomando um palpite aqui, porque eu não tentei nada.

A expansão de til é um pouco incômoda nas variáveis, pois é expandida antes de as variáveis arte serem expandidas.

Funciona bem com nomes de arquivos sem um til?

Além disso, você faria bem em testar algumas suposições, como $location sendo um arquivo legível. Você pode querer sair com uma mensagem útil. Isso possivelmente também ajudará você a depurar seu script.

    
por 14.12.2015 / 19:03
0
tr -sc "\n$input" '[\n*]' <in | grep -xcFe"$input"

... provavelmente faria isso de forma bastante eficiente. Mas provavelmente não funcionará muito bem se você quiser apenas corresponder as palavras todo . Para isso você pode fazer:

tr \[:space:]\[:punct:] '[\n*]' <in | grep -xcFe"$input"

... ou talvez ...

tr -c \[:alnum:]_ '[\n*]' <in | grep -xcFe"$input"

... o que você achar mais apropriado.

    
por 14.12.2015 / 19:30
0

Eu atualizei o que você estava tentando fazer com algumas depurações básicas, enquanto alcançava o que eu acredito que você deseja:

read -p "Please specify a location/file to be searched...Example=/var/tmp/test.txt     : " location
while [[ ! -f ${location} ]] ; do
  read -p "Unable to located file specified, please try again" location
done
read -p "Please specify a search term :" search
result=$(grep -w ${search} ${location} | wc -w)
echo "The search term ${search}, appears ${result} times inside of ${location}"
    
por 15.12.2015 / 00:01