2016-07-23 59 views
1

我有一個腳本,用於爲安裝的IP電話創建配置文件。現在我手動輸入分機號碼和手機密碼,然後輸入MAC地址,以便輸出文件可以正確創建。這工作得很好。以下是我迄今爲止:如何讀取文件,提取字段並將它們用於bash腳本中的變量

#!/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 
[email protected] 
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 
[email protected] 
permit=0.0.0.0/0.0.0.0 
callerid=101 <101> 
callcounter=yes 
faxdetect=no 
cc_monitor_policy=generic 

分機號碼位於方括號[100]中,祕密位於下方兩行。可能有100個擴展或更多。理想情況下,我想運行腳本,並使用條形碼掃描器掃描每個手機的MAC地址。

感謝您的任何幫助。

回答

0

以下awk將讀文件和輸出的分機號碼和祕密

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

UPDATE

假設它並不重要的電話(MAC)將被分配的擴展並保密, 您可以在while循環中使用它,並將輸出分配給兩個不同的變量。如果您想手動讀取每一對MAC,即暫停執行並輸入MAC,則必須在while循環內執行此操作。您不能只從STDINfd0)讀取,但由於STDIN已讀取awk的輸出。因此,來自fd0的read只會從awk的輸出中讀取下一個標記。這可以通過使用不同的文件描述符(在本例中爲fd3)來解決,它首先必須指向STDIN。這就是exec所做的。現在,您可以在while循環內從fd3開始read,並且執行將停止,直到輸入可用。

#!/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 

該腳本期望文件名的擴展名和密碼作爲其第一個參數。如果您不小心點擊Enter,並在輸入MAC地址時跳過擴展/祕密對,應採取措施。

+0

感謝您的回覆。我在我的文件上運行了第一條命令,我得到了祕密但沒有擴展名。 –

+0

@EdLentz您使用哪種發行版? awk --version的輸出是什麼?該命令適用於我的發行版(Ubuntu Mate)和GNU awk 4.1.3。 – nautical

+0

我正試圖在Raspian Jesse的樹莓派上開發這個。版本命令不起作用。我轉移到了我也在使用的Centos 6系統,並且awk可以工作。版本3.1.7我得到了擴展和祕密。現在將這個While集成到我的腳本中。謝謝 –

相關問題