Estou tentando classificar meus registros e descobri que datas de um único dígito foram cortadas incorretamente. Agora eu quero adicione um 0 ou remova o espaço extra.
Antes disso, eu queria ver como obter as linhas corretas que desejo editar.
Uma cauda das últimas 3 linhas:
$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)
Agora trabalhando meu caminho para o script, escrevi isso esperando obter o mesmo resultado:
$ 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)
Mas com isso, o espaço extra antes do 7 é removido. Eu não esperava que isso acontecesse. Eu não estou cortando com meu script, estou?
Obrigado desde já!
Comentários
- O que é divisão de palavras? Por que isso é importante na programação shell? e BashGuide: Divisão de palavras
- Ou talvez devêssemos apenas marcar isso como um duplicata de Por que meu script de shell bloqueia com espaços em branco ou outros caracteres especiais?
- ótimo link @ilkkachu
Resposta
Você “notaria o mesmo para quaisquer outros espaços duplos (ou mais). Expansões de variáveis não citadas são seguidas por divisão de palavras , então, uma vez que as palavras são divididas por espaços (IFS), elas são remontadas com um espaço entre elas.
Uma solução alternativa pode ser :
O shell verifica os resultados da expansão do parâmetro, substituição do comando e expansão aritmética que não ocorrem entre aspas para divisão de palavras.
Como um exemplo concreto, consulte:
$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59
versus:
$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59
Vale a pena ler: Por que meu script de shell bloqueia com espaços em branco ou outros caracteres especiais?
Comentários
- Exemplo:
var='1 1'
(com muitos espaços, eles desaparecem na marcação aqui) seguido porecho $var
eecho "$var"
. - Excelente ponto, na verdade; é ' é o eco não citado que ' está perdendo os espaços.
- muito claro! obrigado @JeffSchaller e kusalananda