【问题标题】:replacing some commands in an existing BASH script替换现有 BASH 脚本中的一些命令
【发布时间】:2015-03-10 21:23:02
【问题描述】:

我有以下通过 OSC 发送 iwlist 扫描结果的脚本:

#!/bin/bash
NUM_BANKS=20

while [[ "$input" != "\e" ]] ; do

networks=$(iwlist wlan0 scanning | awk 'BEGIN{ FS="[:=]"; OFS = " " }
/ESSID/{ 
    #gsub(/ /,"\\ ",$2)
    #gsub(/\"/,"",$2)
    essid[c++]=$2 
}
/Address/{
 gsub(/.*Address: /,"") 
 address[a++]=$0
}
/Encryption key/{ encryption[d++]=$2 }
/Quality/{ 
gsub(/ dBm  /,"")
signal[b++]=$3 
}
END {
for( c in essid ) { print "/wlan_scan ",essid[c],signal[c],encryption[c] }
}' 
)
read -t 0.1  input

echo "$networks" | while read network; do
set $network
hash=` echo "$2" | md5sum | awk '{ print $1 }'| tr '[:lower:]' '[:upper:]'` 
bank=`echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc`
echo "$1$bank $2 $3 $4"
echo "$1$bank $2 $3 $4" | sendOSC -h localhost 9997 
done

#echo "$networks" | sendOSC -h localhost 9997

done

此输出的一个示例是“/wlan_scan13 BTHomehub757 -85 On”,然后通过 sendOSC 程序发送。

我基本上需要用这个tshark扫描的结果替换iwlist扫描数据:

sudo tshark -I -i en1 -T fields -e wlan.sa_resolved -e wlan_mgt.ssid -e radiotap.dbm_antsignal type mgt subtype probe

类似地输出两个字符串和一个int,输出结果如下:

'Hewlett-_91:fa:xx  EE-BrightBox-mjmxxx -78'.  

所以最终我希望脚本在这个

实例中给我一个输出
'/wlan13 Hewlett-_91:fa:xx  EE-BrightBox-mjmxxx -78'.

两种扫描都以大致相同的速率不断生成这种格式的结果,并随着检测到新的 wifi 路由器而更新,并在它们通过 sendOSC 程序到达时立即发送出去。

对于经验丰富的编码人员来说,这可能是一个非常简单的编辑,但我已经尝试解决这个问题好几天了,我想我应该寻求帮助!

如果有人能澄清什么需要留下,什么需要去这里,我真的很感激。

非常感谢。

【问题讨论】:

  • 如果您提高问题的信噪比并提供样本输入和输出数据,您获得帮助的机会就会大得多。
  • 我同意上述评论,但回顾您的历史,加上 uno 实际上在您的问题中有一些代码并且您的坚持。但是我们需要一些样本tshark 输出以及您对该数据的预期输出。祝你好运。
  • 这是个好建议,谢谢。我刚刚编辑了这篇文章,以提供原始脚本输出和 tshark 输出的示例。

标签: bash shell tshark


【解决方案1】:

你真的要替换命令吗?理智的方法似乎是在脚本中添加一个选项来指定要运行哪一段代码,并将它们都包含在内。

# TODO: replace with proper option parsing
case $1 in
   --tshark) command=tshark_networks; shift;;
   *) command=iwlist_networks;;
esac

tshark_networks () {
   sudo tshark -I -i en1 -T fields \
       -e wlan.sa_resolved \
       -e wlan_mgt.ssid \
       -e radiotap.dbm_antsignal type mgt subtype probe
}

iwlist_networks () {
    iwlist wlan0 scanning | awk .... long Awk script here ....
}


while [[ "$input" != "\e" ]] ; do
    networks=$($command)
    read -t 0.1 input
    echo "$networks" | while read network; do
        : the rest as before, except fix your indentation

这还有一个很好的副作用,那就是可怕的iwlist 命令被封装在它自己的函数中,在主循环之外。

...嗯,事实上,我可能会将主循环重构为

while true; do
    $command |
    while read a b c d; do
        hash=$(echo "$b" | md5sum | awk '{ print toupper($1) }')
        bank=$(echo "ibase=16;obase=A; $hash%$NUM_BANKS " | bc)
        echo "$a$bank $b $c $d"
        echo "$a$bank $b $c $d" | sendOSC -h localhost 9997 
    done
    read -t 0.1 input
    case $input in '\e') break;; esac
done

【讨论】:

  • 将函数名放在变量中有点模糊,但我觉得它简化了说明。您可能想要链接一组函数 - 创建一个名为 command 的函数,它在两个数据生成器函数之间切换。
  • stackoverflow.com/a/18870379/874188 提出了一种避免时髦的bc 并仅使用 Awk 的方法。
  • 非常感谢您的时间/努力三人组 - 以及对脚本的总体整理!它实际上只打算运行其中一个进程,但很高兴有这个选项。我是否正确阅读它当前默认运行 tshark_networks 部分?
  • 不,默认是iwlist,只有在使用--tshark选项调用时才会改变。
  • 啊,好的,感谢您的澄清。但是使用 /wlan_scan 打印的变量是否仅由 iwlist_networks 生成,而不是由 tshark_networks 根据需要生成?抱歉,如果这有一个明显的答案,只是想在这里应用我的新手 bash 知识。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 2017-06-18
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多