ファイル内の行を変更せずに表示しようとしていますが、行の最初のスペース/タブが削除されてしまい、回避できません。
私の場合: 「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 を使用して変更することも検討してください。