awk: как использовать переменную в качестве шаблона - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть файл в формате:

==============================
nfsserver1.example.com
==============================
/vol/vol1   -sec=sys,rw=clinet1,root=clinet10
/vol/vol2   -sec=sys,rw=clinet1,root=clinet10

==============================
nfsserver3.example.com
==============================

==============================
nfsserver4.example.com
==============================
/vol/vol1   -sec=sys,rw=clinet4,root=clinet10

и мне нужно переформатировать его так:

nfsserver1.example.com /vol/vol1    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2    -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com
nfsserver4.example.com /vol/vol1    -sec=sys,rw=clinet4,root=clinet10

Вот что я пробовал:

while read server; do
    echo "---- ${server} -----------------------------------------"
    cat file.txt|\
        grep -v "========"|\
        awk -v srv=${server} '/^nfsserver1\.example\.com$/ {f=1} f; /^$/ {f=0}'|\
        grep -v "^$"|\
        awk -v srv=${server} '{printf("%s %s\n",srv,$0)}'
    echo
    server=""
done < <(cat file.txt|grep "^[a-z].*\.example\.com$")

но я не знаю, как именно я могу включить переменную в поиск по шаблону. Я попробовал это:

awk -v srv=${server} '$0 ~ srv {f=1} f; /^$/ {f=0}'

Но выдает неправильный вывод, и я хотел бы иметь точное совпадение с переменной.

---- nfsserver1.example.com -----------------------------------------
nfsserver1.example.com nfsserver1.example.com
nfsserver1.example.com /vol/vol1    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2    -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver1.example.com /vol/vol1 -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver1.example.com /vol/vol2 -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com nfsserver3.example.com
nfsserver1.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver3.example.com -----------------------------------------
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver4.example.com -----------------------------------------
nfsserver4.example.com nfsserver4.example.com
nfsserver4.example.com /vol/vol1    -sec=sys,rw=clinet4,root=clinet10
nfsserver4.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

---- nfsserver3.example.com -----------------------------------------
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver3.example.com
nfsserver3.example.com nfsserver4.example.com /vol/vol1 -sec=sys,rw=clinet4,root=clinet10

Много строк, которые мне не нужны. Я не совсем уверен, откуда они берутся.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018
$ awk '
    NF==1 && /[^=]/ { srvr=$0; done=0 }
    NF==2 { print srvr, $0; done=1 }
    !NF && !done { print srvr }
    END{ if (!done) print srvr }
' file
nfsserver1.example.com /vol/vol1   -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2   -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com
nfsserver4.example.com /vol/vol1   -sec=sys,rw=clinet4,root=clinet10

Весь дополнительный вывод, который вы получили, заключается в том, что вы вызывали awk несколько раз и по какой-то причине обернули вызовы в цикл оболочки.

0 голосов
/ 30 апреля 2018

Awk решение:

awk -v RS='==+\n' \
'/^nfsserver/{ k = $1; n = NR + 1 }
 NR == n{ 
     gsub(/^[[:space:]]*|[[:space:]]*$/, "", $0);
     len = split($0, a, "\n");
     if (!len) len = 1;
     for (i=1; i<=len; i++) print k, a[i]
}' file.txt

Выход:

nfsserver1.example.com /vol/vol1   -sec=sys,rw=clinet1,root=clinet10
nfsserver1.example.com /vol/vol2   -sec=sys,rw=clinet1,root=clinet10
nfsserver3.example.com 
nfsserver4.example.com /vol/vol1   -sec=sys,rw=clinet4,root=clinet10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...