Как несколько вызовов gsub () работают друг с другом в awk? - PullRequest
0 голосов
/ 05 октября 2018

Может кто-нибудь, пожалуйста, помогите мне интерпретировать ниже команды awk?Меня смущает то, что здесь делают несколько функций gsub.

cat vslist.txt | awk '\''/:/{gsub(/ /, \"\", $0);gsub(/{/, \",\", $0);printf $s,$1}'\''");printf "\n"}' 

vslist.txt

ltm pool PL_Axxxxx_POOL {
    members {
        ND_APIxxxxxx:7807 {
            address 12.7.21.6
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7809 {
            address 12.7.21.5
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

        ND_APIxxxxxx:7808 {
            address 12.7.21.9
            app-service none
            connection-limit 0
            description none
            dynamic-ratio 1

Выход

    ND_APIxxxxxx:7807
    ND_APIxxxxxx:7809
    ND_APIxxxxxx:7808

1 Ответ

0 голосов
/ 05 октября 2018

gsub() вызовы изменяют переменную, с которой они работают (в данном случае $0) на месте .Таким образом, один за другим второй дополнительно изменяет вывод первого.

Рассмотрим следующую упрощенную и закомментированную версию вашего скрипта:

#!/bin/bash
awk '
  /:/ {                 # run the below code only for lines that contain :
    gsub(/ /, "", $0);  # remove all spaces
    gsub(/{/, "", $0);  # remove opening curly braces
    print $1            # print the first column in what's next
  }
' <vslist.awk           # with stdin from vslist.awk

Отладка с помощью операторов печати(Или, как посмотреть на себя)

Кстати, вы можете сами убедиться, как взаимодействует gsub() s, добавив дополнительные операторы печати:

#!/bin/bash
awk '
  /:/ {
    print "Input:                                " $0;
    gsub(/ /, "", $0);
    print "After first gsub:                     " $0;
    gsub(/{/, "", $0);
    print "After second gsub, the whole line is: " $0;
    print $1;
  }
' <vslist.awk           # with stdin from vslist.awk

С помощью этой контрольно-измерительной аппаратуры вывод для вашего образца ввода будет:

Input:                                        ND_APIxxxxxx:7807 {
After first gsub:                     ND_APIxxxxxx:7807{
After second gsub, the whole line is: ND_APIxxxxxx:7807
ND_APIxxxxxx:7807
Input:                                        ND_APIxxxxxx:7809 {
After first gsub:                     ND_APIxxxxxx:7809{
After second gsub, the whole line is: ND_APIxxxxxx:7809
ND_APIxxxxxx:7809
Input:                                        ND_APIxxxxxx:7808 {
After first gsub:                     ND_APIxxxxxx:7808{
After second gsub, the whole line is: ND_APIxxxxxx:7808
ND_APIxxxxxx:7808

... так, чтобы вы могли четко видеть, как выполняется каждая из операций (первая убирает пробелы, вторая удаляет {).

...