我试图在不进行任何修改的情况下显示文件中的行,但是行删除了初始空格/制表符,我无法避免。
我的情况:我有“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。