ULL-ESIT-INF-DSI-2122 / ull-esit-inf-dsi-21-22-prct10-async-fs-process-alu0101321745

ull-esit-inf-dsi-21-22-prct10-async-fs-process-alu0101321745 created by GitHub Classroom
0 stars 0 forks source link

Usar 2 pipes. #1

Closed nicovegasr closed 2 years ago

nicovegasr commented 2 years ago

Uso de spawn con 2 tuberias

Buenos dias profesores,

Tengo una duda, estoy intentado utilizar 2 tuberias en un comando para contar las veces que aparece una palabra, se que el enunciado recomienda el uso de un expresion regular pero me gustaría saber si es posible utilizar 2 pipies con el comando spawn.

Un ejemplo sería el siguiente: cat hola.txt | grep -o hola | wc -l Encontré una forma de hacerlo sin el comando .pipe que sería la siguiente:

import {spawn} from 'child_process';

const filename: string = process.argv[2];
const word: string = process.argv[3];

function shspawn(command: string) {
    spawn('sh', ['-c', command], { stdio: 'inherit' });
}

shspawn('cat ' + filename + ' | grep -o ' + word + ' | wc -l');

Y con la función .pipe la verdad que no logro hacerlo, he intentado varias cosas, lo ultimo que he intentado es lo siguiente:

import {spawn} from 'child_process';

const filename: string = process.argv[2];
const word: string = process.argv[3];

const cat = spawn('cat', [filename]);
const grep = spawn('grep', ['-o', word]);
const wc = spawn('wc', ['-l']);

cat.stdout.pipe(grep.stdin);
cat.stdout.pipe(wc.stdin);

let wcOutput = '';
wc.stdout.on('data', (piece) => wcOutput += piece);
console.log(wcOutput);

Agradecería cualquier ayuda, un saludo.

@esegredo @amarrerod

nicovegasr commented 2 years ago

Di con la respuesta, perdonen la molestia.

// cat aria.txt | grep -o aria | wc -l

import {spawn} from 'child_process';

const filename: string = process.argv[2];
const word: string = process.argv[3];

const cat = spawn('cat', [filename]);
const grep = spawn('grep', ['-o', word]);
const wc = spawn('wc', ['-l']);

cat.stdout.pipe(grep.stdin);
grep.stdout.pipe(wc.stdin);

wc.stdout.on('data', (data) => {
    console.log(data.toString());
});