我目前正在为我的 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
将副本存储到文件中后返回输出。file
tee
答案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)