Скрипт awk не может разобрать поле и сохранить в переменной - PullRequest
0 голосов
/ 05 марта 2020
➤ echo "host.example.com:      inet 10.242.177.24/24 brd"| awk '
{
        host=sub(/:/, "", $1);
        ip=sub(/\/.*/, "", $3);
        printf("%s, %s\n", $host, $ip);
}
'
host.example.com, host.example.com

Я ожидаю, что результат будет: host.example.com, 10.242.177.24.

Я подозреваю, что с этим что-то принципиально не так.

Ответы [ 3 ]

3 голосов
/ 05 марта 2020

Ваш код прокомментирован:

$ echo "host.example.com:      inet 10.242.177.24/24 brd" | 
awk '{
        host=sub(/:/, "", $1);           # sub returns 1/0, 1 here 
        ip=sub(/\/.*/, "", $3);          # sub returns 1/0, 1 here
        printf("%s, %s\n", $host, $ip);  # this prints $1, $1
}
'
host.example.com, host.example.com

и исправлен:

$ echo "host.example.com:      inet 10.242.177.24/24 brd" | 
awk '{
        sub(/:/, "", $1);                # sub replaces inplace 
        sub(/\/.*/, "", $3);             # sub replaces inplace
        printf "%s, %s\n", $1, $3        # proper printf
}'
2 голосов
/ 05 марта 2020

Awk не bash. В awk переменные просто variables. $variable анализируется как позиционный параметр $<variable value>. Например, когда variable=1, тогда $variable означает то же самое, что и $1.

. sub анализирует третий аргумент и также помещает его результат в третий аргумент. sub возвращает количество выполненных замен. Таким образом, host становится 1, потому что один : был заменен. И host равно 1, поэтому $host означает то же самое, что и $1.

Вы можете:

    sub(/:/, "", $1);
    sub(/\/.*/, "", $3);
    printf("%s, %s\n", $1, $3);
1 голос
/ 05 марта 2020

С GNU awk:

echo "host.example.com:      inet 10.242.177.24/24 brd" | awk -F ':| +|/' '{print $1 ", " $4}'

Вывод:

host.example.com, 10.242.177.24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...