Estoy tratando de mostrar líneas en un archivo sin ninguna modificación, pero las líneas eliminan los espacios/tabulaciones iniciales y no puedo evitarlo.
Mi caso: tengo el archivo de salida "iptables -L -v"...
...
Chain INPUT (policy DROP 22641 packets, 2686K bytes)
pkts bytes target prot opt in out source destination
20143 11M ACCEPT all -- * * 0.0.0.0/0
0.0.0.0/0 ctstate RELATED,ESTABLISHED 3648 148K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp0 * 0.0.0.0/0 0.0.0.0/0 ...
y estoy intentando mostrar línea por línea...
...
Chain INPUT (policy DROP 22641 packets, 2686K bytes)
pkts bytes target prot opt in out source destination
20143 11M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3648 148K DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- ppp0 * 0.0.0.0/0 0.0.0.0/0
...
Los espacios iniciales se eliminan (no sé si puedes verlo) cuando muestro línea por línea con estos comandos:
for L in `cat FILE` | while read L; do echo "$L";done
o
for L in `cat FILE` | while read L; do printf "%s\n" "$L";done
En este caso, la salida del comando "iptables -L", muestra las columnas de la izquierda alineadas a la derecha y las columnas de la derecha alineadas a la izquierda, obteniendo un efecto agradable, y quiero mostrar línea a línea (coloreo algunas líneas, por ejemplo). con formato idéntico, pero las líneas siempre se muestran alineadas a la izquierda.
¿Sabes por qué y cómo solucionarlo?
Respuesta1
for L in `cat FILE` | while read L; do echo "$L";done
Dudo mucho que esto sea lo que estás ejecutando. El for
bucle no está completo y debería aparecer un error de sintaxis. Ejecutar el comando en sustitución de comandos dentro de la lista de palabras de for
(como en for L in $(cat foo); do...
) dividiría todas las palabras en líneas separadas (y las sometería a agrupación de nombres de archivo).
Sin embargo, algo como
iptables -vL | while read L; do echo "$L"; done
daría sobre el resultado que obtiene: read
divide la entrada IFS
y, como efecto secundario, destruye los espacios en blanco iniciales y finales. Dale un vacío IFS
para obtener lo que quieres. Además, read -r
se recomienda encarecidamente su uso para deshabilitar el procesamiento de barras invertidas, aunque iptables
es poco probable que la salida las tenga. Entonces:
iptables -vL | while IFS= read -r L; do echo "$L"; done
O desde un archivo, sin cat
:
while IFS= read -r L; do echo "$L"; done < file
Si su objetivo es modificar las líneas de entrada de alguna manera, es posible que también desee echar un vistazo a awk o Perl para hacerlo, en lugar del shell.