如何在不做任何修改的情況下顯示線條

如何在不做任何修改的情況下顯示線條

我試圖在不進行任何修改的情況下顯示文件中的行,但是行刪除了初始空格/製表符,我無法避免。

我的情況:我有“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。

相關內容