awk quando a cadeia pode estar em diferentes colunas

1

Eu estou tentando awk informações de um arquivo nomeado com base nos três primeiros octetos de um IP. Neste arquivo o IP pode estar na coluna 2 ou na coluna 4. Se o IP estiver na coluna 2 eu gostaria de imprimir o que está na coluna 2 então o que é a coluna 1. Se o IP está na coluna 4 eu gostaria de imprimir coluna 4 e coluna 1. (Coluna 1 no nome do servidor).

Este é um exemplo da saída com todas as colunas impressas:

awk /10.1.49/ /var/named/internal/Domain/abc.com

A saída é assim:

server01      IN      A       10.1.49.29  
server02      IN      A       10.1.49.80  
;globalname01.abc.com   10.1.49.60  
;globalname02.abc.com   10.1.49.61

Eu quero classificar pela coluna IP e, em seguida, imprimir o IP e o nome do servidor:

10.1.49.20  server01  
10.1.49.60  globalname01.abc.com  
10.1.49.61  globalname02.abc.com  
10.1.49.80  server02  

Eu sei como usar {print NF} para obter uma contagem de colunas, só não sei como usar essas informações, como se NF retornasse 4, em seguida, {print $4 $1} , mas se NF retornasse 2, então {print $2 $1} . .. e, de preferência, classificadas em cima disso (mas eu posso jogar esses dados para um arquivo e, em seguida, lê-lo novamente para classificá-lo se eu precisar).

    
por Thomas Schminke 12.10.2016 / 19:04

2 respostas

3

Tente:

$ awk '$NF~/^10\.1\.49/ {sub(/;/, "", $1); print $NF,$1}' file | sort
10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02

Como funciona

  • $NF~/^10\.1\.49/ {..}

    Isso seleciona linhas para as quais a última coluna começa com 10.1.49 . Para estas linhas, o comando entre chaves é executado.

  • sub(/;/, "", $1)

    O primeiro dos comandos entre chaves é um comando substituto. Remove o ; do primeiro campo, se houver um presente.

  • print $NF,$1

    Imprime o último campo seguido pelo primeiro campo (possivelmente modificado).

  • sort

    Isso classifica a saída. Observe que existem maneiras possíveis de classificar endereços IP e muitas opções de classificação podem ajudá-lo a obter a saída desejada.

por 12.10.2016 / 19:14
0
awk '{ if ($1 ~ /;.*/) { print $2, substr($1, 2); } else { print $4, $1; } }' file  | sort

Saída:

10.1.49.29 server01
10.1.49.60 globalname01.abc.com
10.1.49.61 globalname02.abc.com
10.1.49.80 server02
    
por 12.10.2016 / 20:11

Tags