Buscar..


Parámetros

Parámetro Detalles
IFS Separador de campo interno
expediente Un nombre de archivo / ruta
-r Previene la interpretación de barra invertida cuando se usa con lectura
-t Elimina una nueva línea final de cada línea leída por readarray
-d DELIM Continuar hasta que se lea (con read ) el primer carácter de DELIM, en lugar de nueva línea

Lee archivo (/ etc / passwd) línea por línea y campo por campo

#!/bin/bash
FILENAME="/etc/passwd"
while IFS=: read -r username password userid groupid comment homedir cmdshell
do
  echo "$username, $userid, $comment $homedir"
done < $FILENAME

En el archivo de contraseñas de Unix, la información del usuario se almacena línea por línea, y cada línea consta de información para un usuario separado por dos puntos (:). En este ejemplo, al leer el archivo línea por línea, la línea también se divide en campos que utilizan caracteres de dos puntos como delimitador, lo que se indica mediante el valor dado para IFS.

Entrada de muestra

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Salida de muestra

mysql, 27, MySQL Server /var/lib/mysql
pulse, 497, PulseAudio System Daemon /var/run/pulse
sshd, 74, Privilege-separated SSH /var/empty/sshd
tomcat, 91, Apache Tomcat /usr/share/tomcat6
webalizer, 67, Webalizer /var/www/usage

Para leer línea por línea y tener la línea completa asignada a la variable, a continuación se muestra una versión modificada del ejemplo. Tenga en cuenta que solo tenemos una variable por nombre de línea mencionada aquí.

#!/bin/bash
FILENAME="/etc/passwd"
while IFS= read -r line
do
  echo "$line"
done < $FILENAME

Entrada de muestra

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Salida de muestra

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin

Leer las líneas de un archivo en una matriz

readarray -t arr <file

O con un bucle:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <file

Bucle a través de un archivo línea por línea

while IFS= read -r line; do
   echo "$line"
done <file

Si el archivo no puede incluir una nueva línea al final, entonces:

while IFS= read -r line || [ -n "$line" ]; do
   echo "$line"
done <file

Leer las líneas de una cadena en una matriz

var='line 1
line 2
line3'
readarray -t arr <<< "$var"

o con un bucle:

arr=()
while IFS= read -r line; do
   arr+=("$line")
done <<< "$var"

Corriendo a través de una cuerda línea por línea

var='line 1
line 2
line3'
while IFS= read -r line; do
   echo "-$line-"
done <<< "$var"

o

readarray -t arr <<< "$var"
for i in "${arr[@]}";do
    echo "-$i-"
done

Bucle a través de la salida de una línea de comando por línea

while IFS= read -r line;do
    echo "**$line**"
done < <(ping google.com)

o con una pipa:

ping google.com |
while IFS= read -r line;do
    echo "**$line**"
done

Lee un archivo campo por campo

Supongamos que el separador de campo es : (dos puntos) en el archivo .

while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "$field"
done <file

Para un contenido:

first : se
con
d:
    Thi rd:
    Fourth

La salida es:

**first **
** se
con
d**
**
    Thi rd**
**
    Fourth
**

Leer una cadena de campo por campo

Supongamos que el separador de campo es :

var='line: 1
line: 2
line3'
while IFS= read -d : -r field || [ -n "$field" ]; do
   echo "-$field-"
done <<< "$var"

Salida:

-line-
- 1
line-
- 2
line3
-

Leer los campos de un archivo en una matriz

Supongamos que el separador de campo es :

arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <file

Leer campos de una cadena en una matriz

Supongamos que el separador de campo es :

var='1:2:3:4:
newline'
arr=()
while IFS= read -d : -r field || [ -n "$field" ]; do
   arr+=("$field")
done <<< "$var"
echo "${arr[4]}"

Salida:

newline

Bucle a través de la salida de un campo de comando por campo

Supongamos que el separador de campo es :

while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done < <(ping google.com)

O con una pipa:

ping google.com | while IFS= read -d : -r field || [ -n "$field" ];do
    echo "**$field**"
done


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow