如何读取文件,提取字段并在bash脚本中的变量中使用它们

时间:2016-07-23 13:39:55

标签: bash

我有一个脚本用于为我安装的IP电话创建配置文件。现在我手动输入分机号码和手机的密码,然后输入MAC地址,以便正确创建输出文件。这很好。以下是我到目前为止的情况:

#!/bin/bash
    echo "Enter the Extension #:"
    read extension
    echo "Enter the phone MAC Address:
    read mac
    echo " Extension Password:"
    read password
    cat >/tftpboot/$mac.cfg << EOF
    #!version:1.0.0.1
    account.1.label = $extension
    account.1.display_name = $extension
    account.1.auth_name = $extension
    account.1.user_name = $extension
    account.1.password =  $password
    account.1.sip_server.1.address =  10.1.10.250
    account.1.sip_server.1.port = 5060
    account.1.voice_mail_number= *97
    account.1.subscribe_mwi = 1
    local_time.time_zone = -4
    local_time.ntp_server1 = 10.1.10.250
    network.qos.rtptos = 46
    network.qos.signaltos = 46
    network.port.max_rtpport = 20000
    network.port.min_rtpport = 10000
    EOF
    echo " All Done!"

我将拥有一个文件,该文件将包含运行此脚本的服务器上的所有秘密。以下是该文件的示例:

[100]
deny=0.0.0.0/0.0.0.0
secret=60770f7d87b72dd451dbfd2dd8143b2b
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=pai
type=friend
nat=yes
port=5060
qualify=yes
qualifyfreq=60
transport=udp
encryption=no
callgroup=
pickupgroup=
dial=SIP/100
mailbox=100@default
permit=0.0.0.0/0.0.0.0
callerid=100 <100>
callcounter=yes
faxdetect=no
cc_monitor_policy=generic

[101]
deny=0.0.0.0/0.0.0.0
secret=7c2166c495ccbb637ae43e63c47de435
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=pai
type=friend
nat=yes
port=5060
qualify=yes
qualifyfreq=60
transport=udp
encryption=no
callgroup=
pickupgroup=
dial=SIP/101
mailbox=101@default
permit=0.0.0.0/0.0.0.0
callerid=101 <101>
callcounter=yes
faxdetect=no
cc_monitor_policy=generic

分机号码在括号[100]中,秘密在下面两行。可能有100个或更多的扩展。理想情况下,我想运行escript并使用条形码扫描仪扫描每个电话的MAC地址。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

以下awk将读取文件并输出分机号码和密码

awk  '{if ($0 ~ "\[[[:digit:]]\]") {gsub("\\[|\\]","");ext=$0} else if ($0 ~ "secret.*") {gsub("secret=","");print ext " " $1}}' file 2>/dev/null

<强>更新

假设将哪个电话(MAC)分配给分机和密钥无关紧要, 您可以在while循环中使用它并将输出分配给两个不同的变量。如果要手动读取每对的MAC,即暂停执行并输入MAC,则必须在while循环内执行此操作。但是,您不能只从STDINfd0)读取,因为STDIN已读取awk的输出。因此,来自fd0的read只会从awk的输出中读取下一个标记。这可以通过使用不同的文件描述符(在此示例中为fd3)来修复,首先必须将其指向STDIN。这就是exec的作用。现在,您可以在read循环内fd3 while,执行将停止,直到输入可用。

#!/bin/bash

exec 3<&0 # new file descriptor to read from stdin

file="$1"

while read -r extension password;do
    echo -n "Input MAC address for extension ${extension}: "
    read -u 3 mac # read from fd3 to allow for manual input
    cat > "./${mac}.cfg" << EOF
#!version:1.0.0.1
account.1.label = $extension
account.1.display_name = $extension
account.1.auth_name = $extension
account.1.user_name = $extension
account.1.password =  $password
account.1.sip_server.1.address =  10.1.10.250
account.1.sip_server.1.port = 5060
account.1.voice_mail_number= *97
account.1.subscribe_mwi = 1
local_time.time_zone = -4
local_time.ntp_server1 = 10.1.10.250
network.qos.rtptos = 46
network.qos.signaltos = 46
network.port.max_rtpport = 20000
network.port.min_rtpport = 10000
EOF
# ^ no leading whitespace before EOF allowed
done < <(awk  '{if ($0 ~ "\[[[:digit:]]\]") {gsub("\\[|\\]","");ext=$0} else if ($0 ~ "secret.*") {gsub("secret=","");print ext " " $1}}' "${file}" 2>/dev/null )

exec 3<&- # close file descriptor

脚本需要带有扩展名和secret的文件名作为其第一个参数。您应该采取措施,以防意外点击Enter,然后在输入MAC地址时跳过扩展/密钥对。