Bash
Leer un archivo (flujo de datos, variable) línea por línea (y / o campo por campo)?
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