tail e bash: resultados diferentes quando o mesmo é esperado

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

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 por echo $var e echo "$var".
  • Excelente ponto, na verdade; é ' é o eco não citado que ' está perdendo os espaços.
  • muito claro! obrigado @JeffSchaller e kusalananda

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *