tailとbash:同じことが予想される場合の出力が異なる

ログを並べ替えようとしていますが、1桁の日付が正しくカットされていないことがわかりました。 0を追加するか、余分なスペースを削除します。
その前に、編集する正しい行を取得する方法を確認したかったのです。

最後の3行の末尾:

$tail -3 testlog Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) 

スクリプトへの道を進んでいるので、同じ結果が得られることを期待してこれを書きました:

$ while read line; do if [ $(echo $line|cut -c7) == "b" ]; then echo $line; fi; done < testlog | tail -3 Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) 

しかし、これにより、7の前の余分なスペースが削除されます。これが発生するとは思っていませんでした。スクリプトでカットしていませんか?

よろしくお願いします!

コメント

回答

他の2倍(またはそれ以上)のスペースでも同じことに気付くでしょう。引用符で囲まれていない変数の展開の後に単語の分割が続くので、単語がスペース(IFS)で分割されると、それらの間に1つのスペースがあります。

1つの回避策は:

シェルは、パラメーター展開、コマンド置換、および算術展開の結果をスキャンします単語分割の場合は、二重引用符内で発生します。

具体的な例として、以下を参照してください。

$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59 

対:

$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59 

読む価値があります:シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか?

コメント

  • 例:var='1 1'(スペースが多いと、マークアップに表示されなくなりますここ)の後にecho $varecho "$var"が続きます。
  • 実際には優れた点です。 '引用されていないエコーで、'スペースが失われます。
  • 非常に明確です! @JeffSchallerとkusalanandaに感謝します

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です