Как последовательно выполнять несколько команд в командной строке?

Отметьте следующий параметр в PuTTY:

enter image description here

1
18.05.2018, 15:58
3 ответа

Simplemente pegue su portapapeles en un 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

En lo anterior, escribí 'sh -v << EOF', luego pegué el código de su pregunta en la terminal, luego presioné regresar y escribí 'EOF'. Si hace este tipo de cosas, asegúrese de cuidadosamente revisar el texto que está pegando. Probablemente querrá citar el delimitador (, por ejemplo,sh << 'EOF')para evitar la interpolación de cualquiera de los textos pegados, pero eso no es necesario en este caso.

Pero tenga en cuenta que, en este caso particular, parece mejor usar awk para contar los registros coincidentes, de modo que solo tenga que pasar una vez por el archivo.

1
27.01.2020, 23:18

Eso no es demasiado simple de hacer si está copiando -y pegando los comandos en el emulador de terminal. El problema aquí es que la terminal (que maneja la entrada y visualización de texto )es un proceso distinto del shell (que imprime su solicitud y procesa la línea de comando ), y la terminal realmente no puede saber el significado del texto que está pegando. Por lo tanto, no puede esperar a que finalice el comando anterior y que el shell vuelva a solicitarlo.

Lo que podría hacer sería usar set -vo set -xpara que el shell imprima los comandos a medida que los ejecuta, o en ese caso particular, escribir un bucle de shell corto para ejecutar greps:

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

Eso daría un resultado como este

type_of_record_new creating: 469005
type_of_record_modification found 1: 9999

aunque, por supuesto, el formato exacto podría modificarse. Si desea los números en líneas separadas y alineados a la derecha, puede usar la sustitución de comandos y printf %dpara el número de líneas:

for pattern in...
do
    printf "%s:\n%8d\n" "$pattern" "$(grep -c -e "$pattern" type_of_record.txt)" 
done
3
27.01.2020, 23:18

Usar echopodría hacerlo

Primero, literalmente repetiría el comando como una cadena, usando comillas simples -, luego

En segundo lugar, repetiría el comando usando comillas dobles -, lo que ejecutará el comando

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

que da

robert@pip2:/tmp$ echo '$(date)'; echo "$(date)"
$(date)
Fri May 18 07:30:27 PDT 2018
0
27.01.2020, 23:18

Теги

Похожие вопросы