Como eu executo vários comandos seqüencialmente na linha de comando?

1

Estou colando vários comandos em minha linha de comando e gostaria que cada linha fosse executada e gerasse os resultados sequencialmente.

Estou colando minha entrada:

cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l   

e obtendo resultados:

  469005
    9999
    5099
      25

Mas, em vez disso, gostaria que cada comando fosse executado após cada quebra de linha e que minha saída se parecesse com:

cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l
469005
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l
9999
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
5099                                                                       

Não tenho certeza se isso é possível, mas isso me pouparia muito tempo se eu não precisasse mapear cada resultado de volta para a linha de onde veio

    
por Kamilski81 18.05.2018 / 14:58

3 respostas

2

Isso não é muito simples de fazer se você estiver copiando e colando os comandos no emulador de terminal. O problema aqui é que o terminal (que lida com entrada e exibição de texto) é um processo distinto do shell (que imprime seu prompt e processa a linha de comando), e o terminal não pode realmente saber o significado do texto que você está colando. Portanto, não pode esperar que o comando anterior seja concluído e que o shell solicite novamente.

O que você poderia fazer seria usar set -v ou set -x para fazer com que o shell imprima os comandos à medida que eles são executados ou, nesse caso específico, grave um loop curto para executar o grep s:

for pattern in 'type_of_record_new creating' \
    'type_of_record_modification found 1' \
    'type_of_record_modification found 0' \
    'type_of_record_inactivation found 1'
do
    printf "%s:\n%10d" "$pattern"
    grep -c -e "$pattern" type_of_record.txt
done

Isso daria uma saída como essa

type_of_record_new creating: 469005
type_of_record_modification found 1: 9999

embora o formato exato possa ser modificado. Se você quiser os números em linhas separadas e alinhados à direita, você pode usar a substituição de comandos e printf %d para o número de linhas:

for pattern in ...
do
    printf "%s:\n%8d\n" "$pattern" "$(grep -c -e "$pattern" type_of_record.txt)" 
done
    
por 18.05.2018 / 15:30
0

Basta colar sua área de transferência em um heredoc:

$ sh -v << EOF
> cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
> cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
> cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
> EOF
cat type_of_record.txt | grep 'type_of_record_new creating' | wc -l           
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 1' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_modification found 0' | wc -l   
cat: type_of_record.txt: No such file or directory
       0
cat type_of_record.txt | grep 'type_of_record_inactivation found 1' | wc -l
cat: type_of_record.txt: No such file or directory
       0

No texto acima, digitei "sh -v < < EOF ', em seguida, cole o código da sua pergunta no terminal e, em seguida, pressione Enter e digite' EOF '. Se você fizer esse tipo de coisa, verifique cuidadosamente o texto que está colando. Você provavelmente desejará citar o delimitador (por exemplo, sh << 'EOF' ) para evitar a interpolação de qualquer texto colado, mas isso não é necessário neste caso.

Mas note que neste caso em particular, parece melhor usar o awk para contar os registros correspondentes, de modo que você só precise passar um passo pelo arquivo.

    
por 18.05.2018 / 15:56
0

Usar echo pode fazer isso

Primeiro, você literalmente faria o eco do comando como uma string, usando aspas simples, então

Segundo, você faria o eco do comando usando aspas duplas, que executariam o comando

echo '$(date)'; echo "$(date)"

que dá

robert@pip2:/tmp$ echo '$(date)'; echo "$(date)"
$(date)
Fri May 18 07:30:27 PDT 2018
    
por 18.05.2018 / 16:34