変更せずに線を表示する方法

変更せずに線を表示する方法

ファイル内の行を変更せずに表示しようとしていますが、行の最初のスペース/タブが削除されてしまい、回避できません。

私の場合: 「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 を使用して変更することも検討してください。

関連情報