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 for
loop 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: read
divide a entrada IFS
e, como efeito colateral, destrói os espaços em branco iniciais e finais. Dê um vazio IFS
para conseguir o que deseja. Além disso, read -r
é altamente recomendável usar para desabilitar o processamento de barras invertidas, mesmo que iptables
a 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.