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

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

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

私の状況: "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
    ...

次のコマンドを使用して1行ずつ表示すると、最初のスペースが削除されます(表示できるかどうかわかりません)。

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ループがまだ完了していないため、構文エラーが発生するはずです。単語リスト内のコマンド置換内でコマンドを実行すると、すべての単語が別々の行に分割されます(ファイル名のグロービングが適用されます)forfor L in $(cat foo); do...

しかし、同じ

iptables -vL | while read L; do echo "$L"; done

あなたが得る結果を得るでしょう:read入力を分割しIFS、副作用として先行および末尾のスペースを破壊します。IFS必要なものを取得するにはnullを指定してください。また、出力にバックスラッシュがない可能性が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を使用してこれを行うこともできます。

おすすめ記事