Questão Como buscar o endereço e modificar o valor no arquivo de formato chave / valor?


Atualmente estou escrevendo um script de shell para o meu Raspberry Pi para que ele configure um ponto de acesso com um SSID exclusivo. Para fazer isso, quero usar o endereço MAC do dongle WiFi como meu SSID. Para fazer isso eu quero usar o awk, com

awk '{ gsub(/:/, ""); print > "file" }' /sys/class/net/wlan0/address

Eu posso escrever o endereço mac corretamente formatado em um arquivo, mas como posso inseri-lo em uma linha / lugar específico em outro arquivo? Eu tenho em mente algo como

awk '{ gsub(/:/, ""); "replace ssid= at /etc/hostapd/hostapd.conf"  }' /sys/class/net/wlan0/address

Qualquer ajuda mais explicação para um novato como eu é apreciado.


Meu arquivo de entrada é como:

$ cat /sys/class/net/wlan0/address
01:23:45:67:89:ab

e eu estou tentando buscá-lo e substituir o valor de ssid no arquivo que é como:

interface=wlan0 driver=nl80211 ssid=7cdd907f6b07 hw_mode=g channel=11 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=1 wpa_passphrase=My_Passphrase wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP

2


origem


Você pode colar algum conteúdo de exemplo de / sys / class / net / wlan0 / address para analisar? E quais são os resultados esperados? - kenorb
@kenorb o conteúdo é um endereço mac: 7c:dd:90:7f:6b:07 e os resultados esperados são ssid=pi_7cdd907f6b07 dentro do /etc/hostapd/hostapd.conf - Jabaal
Apenas uma linha com algo parecido 01:23:45:67:89:ab? Você pode simplesmente usar grep: grep -o ..:..:..:..:..:.. >> file? Ou a questão é que você quer na linha em particular? Você tem ex em Rasberry Pi? - kenorb
Eu tenho várias linhas dentro do /etc/hostapd/hostapd.conf- Eu só preciso modificar o que tem ssid=some_ssid - a grep comando apenas grava em um arquivo. - Jabaal


Respostas:


 awk 'NR==FNR{gsub(":","");macadd=$0;next}{sub(/^ssid=.*/,"ssid="macadd)}1' /sys/class/net/wlan0/address /etc/hostapd/hostapd.conf

Registro atual não. (NR) é igual ao registro do arquivo atual no. apenas para o primeiro arquivo, então :A substituição é feita, subseqüentemente a linha é colocada no macadd variável e next pula a saída de linha.

As outras instruções são aplicadas ao hostapd.conf Arquivo; final 1 significa "true", assim linhas são impressas.

Se everyting funcionar bem, você pode redirecionar a saída do comando para um novo arquivo e substituir hostapd.conf.

Notas:

  • pedido de arquivos faz importa, como você pode dizer
  • gawk apresenta substituição no local a partir de 4.1.0

0



perfeito! Exatamente o que eu estava procurando. - Jabaal
Obrigado pelo seu feedback! Uma observação, embora você provavelmente tenha entrado nesta definição: quando você lê "record" no awk, você pode pensar em uma linha (como neste caso) ou parte dela (um "campo") - SΛLVΘ


sed -i.bak "s/^ssid=.*/ssid=$(tr -d ':'</sys/class/net/wlan0/address|tee file)/" /etc/hostapd/hostapd.conf

Uma vez testado, você pode remover o .bak parte, que cria um backup de hostapd.conf. Eu acho que você também vai deletar |tee file.

o ^ sign in regexps significa "início da linha"; a s operador em sed substitui um regexp por uma string dada. Dado string aqui tem um subshell chamado thru $(...), obtendo address conteúdo, purgando-o de :está com tr, e retornando a saída após uma cópia ser armazenada no file arquivo pelo tee comando.


0



Sua resposta é útil e funciona, embora eu esteja procurando especificamente awk solução. - Jabaal
toda a linha será substituída ou apenas ssid:=? - Jabaal
Nenhum cólon no meu regexp. Regras aplicáveis: ^ significa início de linha; . significa qualquer caractere único; a* significa zero ou mais de a. Teste-o você mesmo. BTW, você sentiu falta do awk solução que tentei anotar? - SΛLVΘ


Em seguida, carregue e salve no local usando ex editor, tente:

ex +'let @m = substitute(system("cat /sys/class/net/wlan0/address"), "[^0-9a-z]", "", "g")' +'%s/ssid=\zs[a-f0-9]\{12}/\=@m/' -scwq /etc/hostapd/hostapd.conf

qual:

  • pega o endereço MAC do arquivo (system("cat file") que é equivalente a readfile('file')
  • substituir a saída, removendo tudo isento [0-9a-z]
  • em seguida, atribuí-lo em @m registo
  • então substitua em hostapd.conf encontrando ssid e substituindo \{12} personagens de [a-f0-9] com valor de m registo (\=@m)

    em outras palavras, é como: %s/^key=\zs.\+/new_value/

  • em seguida, salve o arquivo no local (-cwq)

Para depurá-lo, você pode:

  • adicionar extra +%p (para imprimi-lo) e alterar -scwq para dentro -scq! para execução a seco (sem alterar o arquivo)
  • adicionar -V1 para mais verboso

Para buscar apenas o endereço MAC de ifconfig é fácil fazer com grep, gostar:

ifconfig wlan0 | egrep -om1 "..(:..){5}"

ou:

grep -o ..:..:..:..:..:.. <(ifconfig wlan0)

0