Awk: типы вар и выходной формат - PullRequest
0 голосов
/ 02 марта 2012


Это моя супер сложная программа awk:

#!/usr/bin/awk -f
BEGIN {
count = 0
}

{ if ( $1 == "r" )
    {
    nom = $2 
    ip= $7
    numerolinea = NR
    }
 else { 
  where = match($0, "Fast")
  if ( where ) 
    {
     count++
     printf( "\t%5i %20s %15s\n",count,nom,ip )     
    }
      } 
}

Итак, как вы можете видеть, nom и ip обрабатываются как строки, каждая из которых имеет свою длину. Отрывок вывода это было бы так:

    | 111          cutemyserver1     93.27.255.24 |                                                                                       
    | 112 thisisthenamemyserver2     60.231.2.255 |                                                                                       
    | 113   anotherlongmyserver3   191.44.192.260 |                                                                                       
    | 114              myserver4   173.374.76.183 |                                                                                       
    | 115           formyserver5    145.146.321.8 |                                                                                       
    | 116              myserver6     64.31.359.70 |                                                                                       
    | 117        foofoomyserver7    245.16.19.338 |

Как вы также можете видеть, count является целым числом. Моя цель - count, чтобы выровнять как nom и ip, из-за этого:

    | 8            myserver6  91.580.144.231 |                                                                                         
    | 9                narnd   163.11.783.10 |                                                                                         
    | 10                erreer   59.194.0.353 |                                                                                        
    | 11                111111  178.70.644.91 | 

Но обман с %5i не работает.

Спасибо

1 Ответ

1 голос
/ 02 марта 2012

Я исправил вашу проблему и позволил сделать ваш код более "похожим на awk":

#!/usr/bin/awk -f

$1=="r" {nom=$2;ip=$7;next;}

/Fast/ {printf "\t%5d %20s %15s\n",++count,nom,ip;}

NB.

  1. count не требует инициализации в этом примере.
  2. numerolinea не имеет ссылки
  3. condition {...} является более "похожим на awk" способомвысказывание if...then
  4. next предотвращает последующее тестирование условий
  5. ++count обновляет переменную перед предложением ее значения
  6. /Fast/ {...} выполняется, когда регулярноевыражение Fast находится в $0
  7. Как правильно говорит Гленн, %5d - это синтаксис, который вам необходим в вашем printf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...