Soy nuevo en Linux y decidí aprender scripting de shell. He creado un archivo data.txt que contiene el siguiente texto:

12345 Nick Abrams A 10900
67890 George Kennedy I 20000
(text goes on...)

El primer campo es el número PIN de una tarjeta, el segundo es el nombre del cliente, el tercero es el apellido, el cuarto indica si una tarjeta está activa (o inactiva) y el último campo es el saldo del cliente. Necesito escribir un script que reciba el pin del cliente desde el teclado y si ese pin está escrito en el archivo de texto, entonces el script debe imprimir el nombre y el apellido del cliente en la pantalla. He usado grep como este

grep "^$pin" data.txt

Pero devuelve todos los detalles de un cliente. Solo necesito imprimir el segundo y tercer campo e ignorar todo lo demás. ¿Hay algún parámetro para aislar las palabras que necesito?

3
John M. 17 ene. 2018 a las 17:43

3 respuestas

La mejor respuesta

¿Podrías intentar seguirme y decirme si esto te ayuda?

cat script.ksh
echo "Please enter your choice:"
read value

awk -v val="$value" '$1==val{print $2,$3}' Input_file

EDIT: Agregando una solución con grep y cut en un script también aquí.

cat script.ksh
echo "Please enter your choice:"
read value

grep "$value" Input_file | cut -d" " -f2,3
2
RavinderSingh13 17 ene. 2018 a las 15:01

Mejor uso sed:

sed -n 's/^'"$pin \([^ ]* [^ ]*\).*"'/\1/p' data.txt

Este comando coincide con una línea que comienza por $pin y escribe solo una parte que sigue la expresión regular entre \( y \)

1
romaric crailox 17 ene. 2018 a las 14:50
#!/bin/bash

echo "Enter PIN, please"
read pin

grep "${pin}" pins.txt | awk '{print $2" "$3}'

Entrada: 12345

Salida: Nick Abrams

O con cut:

#!/bin/bash

echo "Enter PIN, please"
read pin

grep "${pin}" pins.txt | cut -d' ' -f2,3
1
Viktor Khilin 17 ene. 2018 a las 14:57