Como mostrar linhas sem qualquer modificação

Como mostrar linhas sem qualquer modificação

Estou tentando mostrar linhas em um arquivo sem nenhuma modificação, mas a linha remove espaços/tabulações iniciais e não consigo evitar.

Meu caso: tenho o arquivo de saída "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 ...

e estou tentando mostrar linha a linha...

    ...
    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
    ...

Os espaços iniciais são removidos (não sei se você consegue visualizar), quando mostro linha a linha com estes comandos:

for L in `cat FILE` | while read L; do echo "$L";done

ou

for L in `cat FILE` | while read L; do printf "%s\n" "$L";done

Neste caso, a saída do comando "iptables -L", mostra as colunas da esquerda alinhadas à direita e as colunas da direita alinhadas à esquerda, obtendo um efeito legal, e quero mostrar linha a linha (coloro algumas linhas, por exemplo), com formato idêntico, mas as linhas aparecem sempre alinhadas à esquerda.

Você sabe por que e como resolver isso?

Responder1

for L in `cat FILE` | while read L; do echo "$L";done

Duvido muito que seja isso que você está executando. O forloop não está completo e você deverá receber um erro de sintaxe. Executar o comando na substituição de comando dentro da lista de palavras de for(como em for L in $(cat foo); do...) dividiria todas as palavras em linhas separadas (e as sujeitaria ao globbing do nome do arquivo).

No entanto, algo como

iptables -vL | while read L; do echo "$L"; done

daria sobre a saída que você obtém: readdivide a entrada IFSe, como efeito colateral, destrói os espaços em branco iniciais e finais. Dê um vazio IFSpara conseguir o que deseja. Além disso, read -ré altamente recomendável usar para desabilitar o processamento de barras invertidas, mesmo que iptablesa saída provavelmente não as tenha. Então:

iptables -vL | while IFS= read -r L; do echo "$L"; done

Ou de um arquivo, sem cat:

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

Se o seu objetivo é modificar as linhas de entrada de alguma forma, você também pode dar uma olhada no awk ou Perl para fazer isso, em vez do shell.

informação relacionada