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
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
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
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"
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é.
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
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
sudo chmod +x script.sh
$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
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}
Tags grep shell-script