tail と bash: 同じ期待値で異なる出力

tail と bash: 同じ期待値で異なる出力

ログをソートしようとしましたが、1桁の日付が誤って切り捨てられていることがわかりました。今、ゼロを追加するか、余分なスペースを削除したいと思います。
その前に、編集したい正しい行を取得する方法を知りたいです。

最後の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より前の余分なスペースが削除されます。私はこのようなことが起こるとは思わなかった。私はそれを台本から切り取らないでしょう。そうですか?

よろしくお願いします!

ベストアンサー1

他の二重(またはそれ以上)スペースにも同じことが当てはまります。引用符のない変数拡張の後には、単語スプレーが続きます。したがって、単語が空白(IFS)に分割されると、それらの間にスペースを入れて再結合します。

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

読む価値がある内容:スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

おすすめ記事