При использовании AWK с переменным шаблоном не удается заставить работать оператор IF ELSE.

  • Перейти к последней строке в файле:G
  • Перейти к первой строке в файле:1G
  • Перейти в конец строки:$
  • Перейти к началу строки:^
1
08.09.2019, 19:34
1 ответ

Правильный подход — просто вызвать awk один раз со списком IP-адресов, создать массив тегов/имен для значений(f[]ниже )и просто получить доступ к значениям по их именам. Нет циклов оболочки (, которые были бы очень медленными ), и нет линий getlines (, см. http://awk.freeshell.org/AllAboutGetline, почему их обычно лучше избегать )требуется:

$ cat tst.sh
#!/bin/env bash

declare -a iplist=(
    '192.168.0.10'
    '192.168.0.20'
    '192.168.0.30'
    '999.999.999.999'
)

awk -v iplist="${iplist[*]}" '
    BEGIN {
        split(iplist,tmp)
        for (idx in tmp) {
            ip = tmp[idx]
            cnt[ip] = 0
        }
        OFS = "="
        sep = "-----"
    }
    {
        tag = val = $0
        sub(/=.*/,"",tag)
        sub(/^[^=]+=/,"",val)
        f[tag] = val
    }
    $0 == sep {
        ip = f["ip"]
        if ( ip in cnt ) {
            cnt[ip]++
            print "ip", ip
            print "path", f["path"]
            print sep
        }
        delete f
    }
    END {
        for (ip in cnt) {
            if ( cnt[ip] == 0 ) {
                print "ip", ip " NOT IN CONFIG"
                print sep
            }
        }
    }
' config

.

$./tst.sh
ip=192.168.0.10
path=/home/user/D1/test/server1
-----
ip=192.168.0.20
path=/home/user/D1/test/server1
-----
ip=192.168.0.30
path=/home/user/D1/test/server1
-----
ip=999.999.999.999 NOT IN CONFIG
-----

Я использую tag = val = $0и т. д., чтобы отделить теги от их значений, а не полагаться на настройку FS="=", поскольку =может появляться в каталогах или именах файлов UNIX и, следовательно, может появляться в path.

1
28.04.2021, 23:29

Теги

Похожие вопросы