lldpneighbors
모든 서버의 명령 결과가 포함된 파일이 있습니다. 이 데이터를 인벤토리 시스템으로 더 쉽게 가져올 수 있도록 이 파일을 각 서버마다 별도의 파일로 분할하고 싶습니다.
입력 예
=== Output from 00000000-0000-0000-0000-000000000000 (SERVERNAME1):
Interface 'ixgbe0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/6
Time To Live: 120 seconds
System Name: name-of-switch-01
End Of LLDPDU:
Interface 'igb0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/23
Time To Live: 120 seconds
System Name: name-of-switch-02
End Of LLDPDU:
=== Output from 00000000-0000-0000-0000-000000000000 (SERVERNAME2):
Interface 'ixgbe0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/2
Time To Live: 120 seconds
System Name: name-of-switch-01
End Of LLDPDU:
Interface 'igb0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/19
Time To Live: 120 seconds
System Name: name-of-switch-02
End Of LLDPDU:
이것은 약간의 변형을 제외하고 대략적인 모든 결과의 모습입니다(모두 같은 길이는 아니며 일부는 더 많은 인터페이스로 인해 몇 줄 더 길어집니다). 일치시키려는 구분된 문자열은 다음과 같습니다.
=== Output from [UUID] ([HOSTNAME]):
이상적으로는 각 파일의 이름을 호스트 이름으로 지정하고 싶습니다(이는 편의를 위한 것일 뿐 필수는 아님). 위의 결과는 다음과 같은 파일로 분할됩니다.
서버 이름 1
=== Output from 00000000-0000-0000-0000-000000000000 (SERVERNAME1):
Interface 'ixgbe0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/6
Time To Live: 120 seconds
System Name: name-of-switch-01
End Of LLDPDU:
Interface 'igb0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/23
Time To Live: 120 seconds
System Name: name-of-switch-02
End Of LLDPDU:
서버 이름 2
=== Output from 00000000-0000-0000-0000-000000000000 (SERVERNAME2):
Interface 'ixgbe0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/2
Time To Live: 120 seconds
System Name: name-of-switch-01
End Of LLDPDU:
Interface 'igb0' has 1 LLDP Neighbors:
Neighbor 1:
Chassis ID: MAC Address - 00 01 02 03 04 05
Port ID: Interface Name - TenGigabitEthernet 0/19
Time To Live: 120 seconds
System Name: name-of-switch-02
End Of LLDPDU:
나는 csplit
이것을 달성하기 위해 사용하려고 노력하고 있지만 어떤 이유로 정규식과 일치할 수 없습니다. 내가 시도한 명령:
$ csplit jbutryn_us-west-a_neighbors %===.*:% '{20}'
csplit: ===.*:: no match
$ csplit jbutryn_us-west-a_neighbors /===.*:/ '{20}'
552
552
552
csplit: ===.*:: no match
$ csplit jbutryn_us-west-a_neighbors '/===.*:/' '{20}'
552
552
552
csplit: ===.*:: no match
$ csplit -ks -f test jbutryn_us-west-a_neighbors '/===.*:/' '{20}'
csplit: ===.*:: no match
어떤 제안이 있으십니까?
답변1
앗해결책:
awk '/^===/{ fn=substr($NF,2,length($NF)-3) }{ print > fn }' file
각 파일의 이름은 다음에 따라 지정됩니다.CPU 이름( SERVERNAME<number>
)
/^===/
- 다음으로 시작하는 줄을 만날 때===
fn=substr($NF,2,length($NF)-3)
- 파일 이름을 구성합니다fn
.substr($NF,2,length($NF)-3)
- 주변의 괄호를 무시하고 호스트 이름을 추출합니다($NF
- 마지막 필드).print > fn
- 기본 줄을 파일로 인쇄
답변2
정규식을 과도하게 지정하지 마세요.
$ csplit logfile '/^===/'
xx00
이렇게 하면 1부와 xx01
2부가 생성됩니다 .
===
또는 다음으로 시작하는 다른 줄이 있는 경우아니요분할하고 싶은 경우:
$ csplit logfile '/^=== Output from/'
xx
다른 고정 문자열로 바꾸려면 다음을 사용하십시오 -p
(안타깝게도 이 문자열은 입력 데이터에서 얻을 수 없습니다).