2016-03-24 20 views
0

Linux ve Bash komut dosyalarında yeniyim. Ubuntu Linux'ta birkaç bash betiğini JSON formatına çıkarmaya çalışıyorum, ancak düzgün çalışmasını sağlayamıyorum.bash çıkışı json biçimine

böyle
"datetime":datetime_string, 

    "osversion":string, 

    "ip_info: [{"interface":string,"ip_addr":string,"mask":string,"gateway":string}, 
      {"interface":string,"ip_addr":string,"mask":string,"gateway":string}], 
+1

jq - https://stedolan.github.io/jq/ - senin arkadaşın . –

+2

Ayrıca, 'ifconfig' kullanmayın; On yıldan fazla bir süredir hiç kimsenin elinde olmayan eski bir araç. IP'leri Linux'ta ağ kümesinin yeni ve modern bölümleriyle çalışan bir şekilde listelemek istiyorsanız, 'ip -o addr list' komutunu kullanın. –

+0

... btw, 'gateway', ifconfig -a'nın çıktısında mevcut değil. Yönlendirme tablosu arabirime özgü olmadığından, bunların bir arada saklanmasını/yönetilmesini beklemez ... –

cevap

0

şey jo ile yapmak oldukça kolay olmalıdır:

jo datetime=$(date -u +%Y-%m-%d:%H:%M:%S) osversion=$(lsb_release -a) ip_info=$(jo -a $(ip -o addr list)) 
+0

Burada "jo" ip -o addr listesinin alanları nasıl? İstenen çıktı formatını nasıl alabileceğimi anlamıyorum. –

+0

Ayrıca, kabuğun 'jo''ya geçmeden önce anahtar/değer çiftlerinizi dize ayırmasını önlemek için daha fazla kotaya ihtiyacınız var. –

0

JSON bu formatta içine

date -u +%Y-%m-%d:%H:%M:%S //date and time 

lsb_release -a //os distro version 

ifconfig -a //ip info 

:

Amacım bu elde etmektir Bash'in kendisi JSON desteği içermiyor. Böylece uygunluğunu garanti etmek, sen inşa JSON ayrıştırma ve kuşak desteği ile harici bir programı kullanmak gerekir jq bunlardan biridir ve aşağıda kullanır built-in regex desteği:.

jq --raw-input \ 
    --arg date "$(date)" \ 
    --arg osver "$(lsb_release -a)" \ 
    '{"date": $date, 
    "osver": $osver, 
    "ip_info": [inputs | 
       capture("^[0-9]+: (?<ifname>[^[:space:]]+)[[:space:]]+inet (?<addr>[^[:space:]/]+)(/(?<masklen>[[:digit:]]+))?") 
       ] 
    }' \ 
    < <(ip -o addr list | grep 'inet ') 

Bu kodu görün eylem on JQPlay. Eğer Linux dağıtımı yerleşik olmayan araçlar yükleyemiyorsan


, Python düşünün:

#!/bin/bash 
#  ^^^^ - important, not /bin/sh; this uses some bash-only syntax 

py_code=$(cat <<'EOF' 
import json, re, sys 

content={'ip_info': []} 
for k, v in [ arg.split('=', 1) for arg in sys.argv[2:] if '=' in arg ]: 
    content[k]=v 

ip_re = re.compile(r'^[0-9]+:\s+(?P<ifname>\S+)\s+inet (?P<addr>[^/\s]+)(?:/(?P<masklen>\d+))?') 
for line in open(sys.argv[1]).readlines(): 
    m = ip_re.match(line) 
    if not m: raise "NOOOO" 
    content['ip_info'].append({ 
    'ifname': m.groups('ifname'), 
    'addr': m.groups('addr'), 
    'masklen': m.groups('masklen'), 
    }) 

print json.dumps(content) 
EOF 
) 

python -c "$py_code" \ 
    <(ip -o addr list | grep 'inet ') \ 
    "date=$(date)" "osver=$(lsb_release -a)" 
+0

Charles, bunu Python 2.6.5'te jq olmadan nasıl yazarım? – Fadiddy

+0

@Fadiddy, uzatılmış/değiştirilen cevaba bakınız. –

İlgili konular