変更せずにファイルの行を表示しようとしていますが、行の最初のスペース/タブを削除して回避できません。
私の状況: "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
ループがまだ完了していないため、構文エラーが発生するはずです。単語リスト内のコマンド置換内でコマンドを実行すると、すべての単語が別々の行に分割されます(ファイル名のグロービングが適用されます)for
。for 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を使用してこれを行うこともできます。