Cómo mostrar líneas sin ninguna modificación

Cómo mostrar líneas sin ninguna modificación

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 forbucle 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: readdivide la entrada IFSy, como efecto secundario, destruye los espacios en blanco iniciales y finales. Dale un vacío IFSpara obtener lo que quieres. Además, read -rse recomienda encarecidamente su uso para deshabilitar el procesamiento de barras invertidas, aunque iptableses 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.

información relacionada