我試圖在不進行任何修改的情況下顯示文件中的行,但是行刪除了初始空格/製表符,我無法避免。
我的情況:我有“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。