tail 和 bash:预期相同时的不同输出

tail 和 bash:预期相同时的不同输出

我正在尝试对日志进行排序,发现个位数的日期被错误地剪切。现在我想添加一个 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 之前的多余空格就被删除了。我没想到会发生这种事。我不会用我的剧本来剪掉它,不是吗?

提前致谢!

答案1

您会注意到任何其他双倍(或更多)空格也是如此。不带引号的变量扩展之后是分词,因此一旦单词被空格 (IFS) 分割,它们就会重新组合在一起,中间有一个空格。

一种解决方法可能是:

shell 扫描参数扩展、命令替换和算术扩展的结果没有出现在双引号内用于分词。

具体示例请参见:

$ 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

非常值得一读:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?

相关内容