ログを並べ替えようとしていますが、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の前の余分なスペースが削除されます。これが発生するとは思っていませんでした。スクリプトでカットしていませんか?
よろしくお願いします!
コメント
- 単語分割とは何ですか?シェルプログラミングで重要なのはなぜですか?および BashGuide:Word Splitting
- または、これをの複製シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか?
- すばらしいリンク@ilkkachu
回答
他の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 $var
とecho "$var"
が続きます。 - 実際には優れた点です。 '引用されていないエコーで、'スペースが失われます。
- 非常に明確です! @JeffSchallerとkusalanandaに感謝します