如何在不进行任何修改的情况下显示线条

如何在不进行任何修改的情况下显示线条

我试图在不进行任何修改的情况下显示文件中的行,但是行删除了初始空格/制表符,我无法避免。

我的情况:我有“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 ...

我正在尝试逐行显示...

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

当我使用以下命令显示行对行时,初始空格被删除(我不知道您是否可以查看它):

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

或者

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

在这种情况下,“iptables -L”命令的输出显示左列右对齐,右列左对齐,获得了很好的效果,并且我想要显示行到行(例如,我对一些行进行着色),具有相同的格式,但行始终显示为左对齐。

您知道为什么以及如何解决吗?

答案1

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

我非常怀疑这就是您正在运行的内容。for循环尚未完成,您应该会收到语法错误。在单词列表for(如for L in $(cat foo); do...)内的命令替换中运行命令会将所有单词拆分为单独的行(并使它们服从文件名通配)。

然而,像

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

会给出你得到的输出:read分割输入IFS并作为副作用破坏前导和尾随空白。给它一个空,IFS以获得你想要的东西。另外,read -r强烈建议使用 来禁用反斜杠的处理,即使iptables输出不太可能有反斜杠。所以:

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

或者来自文件,不带cat

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

如果您的目标是以某种方式修改输入行,您可能还想使用 awk 或 Perl 来完成此操作,而不是 shell。

相关内容