如何获取地址并修改键/值格式文件中的值?

如何获取地址并修改键/值格式文件中的值?

我目前正在为我的 Raspberry Pi 编写一个 shell 脚本,以便它设置一个具有唯一 SSID 的接入点。为此,我想使用 WiFi 加密狗的 mac 地址作为我的 SSID。为此,我想使用 awk,

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

我可以将正确格式的 mac 地址写入文件,但如何将其插入另一个文件的特定行/位置?我想到的是

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

任何对我这样的新手的帮助和解释都将不胜感激。


我的输入文件如下:

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

ssid我正在尝试获取它并替换文件中的值,如下所示:

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

答案1

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

NR仅对于第一个文件,当前记录号( )等于当前文件记录号,然后:完成替换,随后将行放在macadd变量上,并next跳过行输出。

其它指令应用于hostapd.conf文件;final1代表“true”,因此打印行。

如果一切正常,您可以将命令输出重定向到新文件,然后替换hostapd.conf

笔记:

  • 文件顺序事情就是这样,正如你所知
  • gawk从 4.1.0 开始提供就地替换功能

答案2

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

测试完成后,您可以删除该.bak部分,从而创建 的备份hostapd.conf。我想您也会删除|tee file

regexps 中的符号^代表“行首”;s中的运算符sed用给定的字符串替换正则表达式。此处给定的字符串有一个名为 thru 的子 shell $(...),用于获取address内容、用 将其从:中清除,并在命令tr将副本存储到文件中后返回输出。filetee

答案3

然后使用编辑器加载并保存它ex,尝试:

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

哪个:

  • 从文件中获取 MAC 地址(system("cat file")相当于readfile('file')
  • 通过删除所有豁免来替代输出[0-9a-z]
  • 然后将其赋值给@m寄存器
  • 然后hostapd.conf通过查找ssid并用寄存器的值替换\{12}的字符来替换( ),[a-f0-9]m\=@m

    换句话说,就像:%s/^key=\zs.\+/new_value/

  • 然后将文件保存到原位(-cwq

要调试它,您可以:

  • 添加额外内容+%p(打印)并更改-scwq-scq!试运行(不更改文件)
  • 添加-V1更多详细信息

要从中获取 MAC 地址很ifconfig容易grep,例如:

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

或者:

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

相关内容