Pegue o valor grep e imprima a contagem e o valor juntos

4

Estou tentando criar um script básico que agregue valor e exiba a contagem e o valor juntos

Algo parecido com isto

grep -c 'Thenis' example.txt > example.lst

Mas nesse arquivo de lista não só para mostrar a contagem, mas também o valor que eu digitei como este

Thenis: 123
    
por Thenis 16.01.2016 / 22:50

6 respostas

5

Você pode iniciar um sub-shell e usar a variável $0 para fazer isso.

bash -c 'echo "$0: $(grep -c $0 example.txt)"' 'Thenis' > example.lst
    
por 16.01.2016 / 22:59
4

Como grep -c imprime apenas o número, precisamos prefixar com o padrão fornecido. Isso pode ser feito usando o shell interno printf para imprimir o padrão sem uma nova linha seguinte. Então deixamos grep imprimir a contagem (na mesma linha).

O uso de parênteses para colocar as duas instruções em uma sub-shell permite que toda a saída seja redirecionada apenas uma vez.

Eu faria assim:

(printf '%s: ' Thenis; grep -c Thenis example.txt) > example.lst

Se você quiser criar um script simples para fazer isso:

#!/bin/sh
if [ "$#" -ne 2 ]
then
    echo >&2 "Usage: $0 pattern file"
    exit 1
fi
printf '%s: ' "$1"
grep -c "$1" "$2"
    
por 16.01.2016 / 23:05
1

Ninguém tentou usar sed ainda?

grep -c Thenis example.txt|sed s/^/Thenis:\ /  > example.lst

ou se você quiser uma solução mais versátil e ter o gnu sed

echo Thenis -- example.txt | \
sed -re 's/^(.*) -- (.*)$/echo -n :;grep -c  /e'

uma palavra de aviso sobre o último: poderoso o suficiente para atirar-se no pé.

    
por 17.01.2016 / 04:36
1

Você pode automatizar isso com variáveis. Além disso, você pode incorporar a saída do comando com o caractere '

Na linha abaixo, altere outputFile=/dev/stdout para seu próprio valor,

string='Thenis'; inputFile=example.txt; outputFile=/dev/stdout;  echo "${string}: 'grep -c ${string} ${inputFile}'" > ${outputFile}

Ou em linhas diferentes

string='Thenis'  
inputFile=example.txt  
outputFile=/dev/stdout 
echo "${string}: 'grep -c ${string} ${inputFile}'" > ${outputFile}

Além disso, para as aspas, você pode usar 'ou ". Para as variáveis, $ var de $ {var}, como você preferir.

Boa sorte

    
por 17.01.2016 / 04:50
1

Tente escrever script.sh :

#!/bin/bash

echo $1: $(grep -c "$1" "$2")

Então, se example.txt :

Then is, Then-is, Then's, Thenis, Thins,
Thesis, Thanes, Thence, Things,
Thenis, Thorns, Thane's

Execute script.sh no seu prompt de comando, salvando sua saída para example.lst :

$ ./script.sh 'Thenis' example.txt > example.lst

O resultado searchword: count desejado pode ser encontrado em example.lst :

$ cat example.lst
Thenis: 2

Detalhes

  • como em todos os scripts, assegure-se de que o script seja executável, por exemplo, emitindo o comando sudo chmod +x script.sh
  • parâmetros posicionais bash: $1 para o primeiro argumento passado para o script.sh , $2 para o segundo e assim por diante
  • $( ... ) é a substituição de comando para obter os resultados dos comandos contidos, fora de uso pelo echo
por 17.01.2016 / 05:19
0

Você pode usar awk . É muito mais flexível.

Por exemplo para emular grep -c você pode usar:

awk '/Thenis/{total+=1}END{print "Thenis: ",total}'

No entanto, observe que, neste caso (isso também se aplica a grep ), apenas as linhas com a palavra Thenis são contadas. Não é a contagem da palavra Thenis. Caso você precise contar o número de palavras do Thenis no arquivo, você pode usar o seguinte awk construction:

awk '/Thenis/{total+=gsub("Thenis","")}END{print "Thenis: ",total}

ou o caminho com variáveis (para digitar Thenis apenas uma vez)

awk -v word="Thenis" '$0 ~ word{total+=gsub(word,"")}END{print word,": ",total}
    
por 17.01.2016 / 16:26