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


2

我正在为我的Raspberry Pi编写一个shell脚本,因此它设置了一个具有唯一SSID的访问点。为此,我想使用WiFi加密狗的mac-address作为我的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

你能粘贴/ sys / class / net / wlan0 / address的一些示例内容来解析吗?你有什么期望的结果?
kenorb 2015年

@kenorb内容是MAC地址7c:dd:90:7f:6b:07和预期结果ssid=pi_7cdd907f6b07的范围内/etc/hostapd/hostapd.conf
Jabaal

只是单行的东西01:23:45:67:89:ab?你能简单地使用grepgrep -o ..:..:..:..:..:.. >> file?或者问题是你想要它在特定的线?你有exRasberry Pi吗?
kenorb 2015年

我有多行/etc/hostapd/hostapd.conf- 我只需要修改一个ssid=some_ssid- grep命令只是写入文件。
Jabaal 2015年

Answers:


0
 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文件; final 1代表“true”,因此打印出行。

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

笔记:

  • 文件顺序的事情,你可以告诉
  • gawk 从4.1.0开始进行就地更换

完善!正是我在寻找的东西。
Jabaal 2015年

感谢您的反馈意见!一句话,虽然您可能已经进入了这个定义:当您在awk中读取“记录”时,您可能会想到一条线(如本例所示)或其中的一部分(“字段”)
SΛLVΘ

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

经过测试,您可以删除.bak部件,从而创建备份hostapd.conf。我想你也会删除|tee file

^在正则表达式符号代表“行首”; 将s在运营商sed替代与给定的字符串的正则表达式。这里给定的字符串有一个叫通子shell $(...),获取address内容,从清洗它:与的tr,并且副本存储在回国后的输出file由文件tee命令。


1
你的答案很有帮助,虽然我特意寻找awk解决方案。
Jabaal 2015年

将整条生产线更换或只是ssid:=
Jabaal 2015年

我的正则表达式中没有冒号。适用的规则:^意味着开始行; .是指任何单个字符; a*表示零个或多个。自己测试一下。顺便说一下,你错过了awk我试着记下的解决方案吗?
SΛLVΘ2015年

0

然后使用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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.