Организовать вывод Grep - PullRequest
       4

Организовать вывод Grep

0 голосов
/ 14 февраля 2019

Нужна помощь в отображении желаемого результата, как в моем примере ниже.Заранее спасибо!

У меня есть (без пуль):

SWTICH1:interface GigabitEthernet1/0/1
SWTICH1: switchport mode access
SWTICH1:interface GigabitEthernet1/0/2
SWTICH1: switchport mode access
SWTICH1:interface GigabitEthernet1/0/3
SWTICH1: switchport mode access
SWTICH1:interface GigabitEthernet1/0/4
SWTICH1: switchport mode access
SWTICH1:interface GigabitEthernet1/0/5
SWTICH1: switchport mode access
SWTICH1:interface GigabitEthernet1/0/6
SWTICH1: switchport mode access

SWTICH2:interface GigabitEthernet1/0/1
SWTICH2: switchport mode access
SWTICH2:interface GigabitEthernet1/0/2
SWTICH2: switchport mode access
SWTICH2:interface GigabitEthernet1/0/3
SWTICH2: switchport mode access
SWTICH2:interface GigabitEthernet1/0/4
SWTICH2: switchport mode access
SWTICH2:interface GigabitEthernet1/0/5
SWTICH2: switchport mode access
SWTICH2:interface GigabitEthernet1/0/6
SWTICH2: switchport mode access

Я хочу, чтобы было так (без пуль):

SWTICH1:
interface GigabitEthernet1/0/1
switchport mode access
interface GigabitEthernet1/0/2
switchport mode access
interface GigabitEthernet1/0/3
switchport mode access
interface GigabitEthernet1/0/4
switchport mode access
interface GigabitEthernet1/0/5
switchport mode access
interface GigabitEthernet1/0/6
switchport mode access
SWTICH2:
interface GigabitEthernet1/0/1
switchport mode access
interface GigabitEthernet1/0/2
switchport mode access
interface GigabitEthernet1/0/3
switchport mode access
interface GigabitEthernet1/0/4
switchport mode access
interface GigabitEthernet1/0/5
switchport mode access
interface GigabitEthernet1/0/6
switchport mode access

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Простое решение awk может выглядеть следующим образом:

awk -F: 'length() && $1!=s {s=$1;print s} {print $2}' input.txt

Это работает путем захвата первого разделенного двоеточиями «поля», и, если оно отличается от предыдущей строки, его печать ...а затем распечатываете второе «поле», в котором находится ваш контент.Если вы хотите, чтобы выходные данные были более точными, это достаточно просто:

awk -F: 'length() && $1!=s {s=$1;print s ":"} length() {gsub(/^ /,"",$2);print $2}' input.txt

Мы используем length() в качестве условия, потому что в противном случае тест $1!=s будет соответствовать пустым строкам.

ПоочередноВы можете сделать это только в bash, реализовав похожую логику:

while IFS=: read a b; do [[ -n "$a" ]] && [[ $s != $a ]] && s="$a" && printf '%s:\n' "$s"; printf '%s\n' "${b## }"; done < input.txt

Или для более простого чтения:

while IFS=: read a b; do
  if [[ -n "$a" ]] && [[ $s != $a ]]; then
    s="$a"
    printf '%s:\n' "$s"
  fi
  printf '%s\n' "${b## }"
done < input.txt

Я включил более сложное форматирование в этом.

0 голосов
/ 14 февраля 2019

Еще один awk

$ awk -F: ' { if($1!=p) { print $1; p=$1; }  $1=""; print }' bantay.txt
SWTICH1
 interface GigabitEthernet1/0/1
  switchport mode access
 interface GigabitEthernet1/0/2
  switchport mode access
 interface GigabitEthernet1/0/3
  switchport mode access
 interface GigabitEthernet1/0/4
  switchport mode access
 interface GigabitEthernet1/0/5
  switchport mode access
 interface GigabitEthernet1/0/6
  switchport mode access


SWTICH2
 interface GigabitEthernet1/0/1
  switchport mode access
 interface GigabitEthernet1/0/2
  switchport mode access
 interface GigabitEthernet1/0/3
  switchport mode access
 interface GigabitEthernet1/0/4
  switchport mode access
 interface GigabitEthernet1/0/5
  switchport mode access
 interface GigabitEthernet1/0/6
  switchport mode access

$
0 голосов
/ 14 февраля 2019

РЕДАКТИРОВАТЬ: В соответствии с комментарием ghoti sir добавление решения, которое будет выдавать вывод в порядке ключевого слова switch и должно работать в любом awk.

awk -F':' '
NF{
  sub(/^ +/,"",$2)
}
!b[$1]++{
  c[++count]=$1
}
{
  a[$1]=(a[$1]?a[$1] ORS $2:$2)
}
END{
  for(i=1;i<=count;i++){
    print c[i] ORS a[c[i]]
  }
}'  Input_file


Не могли бы вы попробовать следующее, похоже, что awk вполне подойдет для этого вопроса.

awk -F':' 'NF{sub(/^ +/,"",$2);a[$1]=(a[$1]?a[$1] ORS $2:$2)} END{for(i in a){print i ORS a[i]}}' Input_file

Объяснение: Добавление объяснения здесь.

awk -F':' '                        ##Setting field separator as colon here.
NF{                                ##Checking if NF value is NOT NULL where NF is number of fields in current line.
  sub(/^ +/,"",$2)                 ##Using sub function of awk which substitutes all initial/starting space from $2(second field) with NULL.
  a[$1]=(a[$1]?a[$1] ORS $2:$2)    ##Creating an array named a whose index is first field of current line and concatenating $2 values to its previous value.
}                                  ##Closing block for NF condition here.
END{                               ##Starting END condition of awk command here.
  for(i in a){                     ##Starting a for loop to traverse through array a here.
    print i ORS a[i]               ##Printing index of array a which is variable i now and ORS(new line) and then value of array a whose index is variable i.
  }                                ##Closing block for for loop here.
}'  Input_file                     ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...