2012-03-15 24 views
13

Tôi có một config.txt tập tin với địa chỉ IP như nội dung như thế nàybash script sử dụng cắt lệnh tại biến và kết quả lưu trữ tại một biến khác

10.10.10.1:80 
10.10.10.13:8080 
10.10.10.11:443 
10.10.10.12:80 

Tôi muốn ping mỗi địa chỉ ip ở chỗ file

#!/bin/bash 
file=config.txt 

for line in `cat $file` 
do 
    ##this line is not correct, should strip :port and store to ip var 
    ip=$line|cut -d\: -f1 
    ping $ip 
done 

Tôi là người mới bắt đầu, xin lỗi vì một câu hỏi như vậy nhưng tôi không thể tự tìm ra.

+0

'cho dòng trong tệp cat' sẽ chạy hai lần ... một lần với' line = cat' và một lần với 'line = file'. Tôi không nghĩ đó là những gì bạn muốn. – FatalError

Trả lời

30

Giải pháp awk là những gì tôi sẽ sử dụng, nhưng nếu bạn muốn hiểu các vấn đề của mình với bash, đây là phiên bản sửa đổi của tập lệnh của bạn.

##config file with ip addresses like 10.10.10.1:80 
#!/bin/bash -vx 
file=config.txt 

while read line ; do 
    ##this line is not correct, should strip :port and store to ip var 
    ip=$(echo "$line" |cut -d\: -f1) 
    ping $ip 
done < ${file} 

Bạn có thể viết dòng đầu của bạn như

for line in $(cat $file) ; do ... 

Bạn cần thay thế lệnh $(...) để có được những giá trị được gán cho $ ip

dòng đọc từ một tập tin thường được coi là hiệu quả hơn với Mẫu while read line ... done < ${file}.

Tôi hy vọng điều này sẽ hữu ích.

+0

+1 không hiệu quả hơn, nhưng an toàn hơn: 'cho dòng trong $ (

+0

@yourmother, lưu ý việc sử dụng dấu ngoặc kép xung quanh các biến ở đây: quan trọng để bảo vệ khoảng trắng trong các giá trị. –

+2

Lưu ý ip có thể được trích xuất với 'ip = $ {line %%: *}' mà không cần phải gọi echo | cut. –

4

Bạn có thể tránh các vòng lặp và cắt vv bằng cách sử dụng:

awk -F ':' '{system("ping " $1);}' config.txt 

Tuy nhiên nó sẽ tốt hơn nếu bạn gửi một đoạn config.txt của bạn

Các vấn đề liên quan