방화벽에서 몇 가지 명령을 실행하고 해당 로그 파일을 여러 개의 작은 파일로 분할했습니다. 내 데이터 파일 MASA1은 다음과 같습니다...
MASA1/pri/act# changeto context admin
MASA1/pri/act/admin# sh run
[removed]
MASA1/pri/act/admin# sh access-list
[removed]
MASA1/pri/act/admin# changeto context Context1
MASA1/pri/act/Context1# sh run
[removed]
MASA1/pri/act/Context1# sh access-list
[removed]
MASA1/pri/act/Context1# changeto context Context2
MASA1/pri/act/Context2# sh run
[removed]
MASA1/pri/act/Context2# sh access-list
[removed]
아래 스크립트는 작동하며 각 컨텍스트 및 각 명령(예: admin_run, admin_acl, Context1_run, ...Context2_acl)에 대해 별도의 파일을 생성합니다.
sed -e '/# sh /{x;p;x};/\<changeto\>/d' MASA1 | awk -v RS= -F '[ ]|[#/]' '{if ($0~ /sh run/) {f=$1"_"$4"_run"; print > f} else {if ($0~ /sh access-list/) {f=$1"_"$4"_acl"; print > f}}}'
그러나 스크립트는 전체 구성(때로는 10,000줄 이상)을 출력합니다. 특정 IP 주소나 개체 이름을 기준으로 출력을 필터링하고 싶습니다. 다음을 사용하여 비슷한 작업을 수행할 수 있습니다.
grep -f 파일 이름
장치에서 20~40개의 컨텍스트를 처리하고 있으므로 장치당 두 개의 파일(_run, _acl)이 있다는 점을 고려하면 40~80개의 추가 파일이 생성됩니다. 검색에 적중된 파일만 저장되고 모든 구성 대신 일치하는 줄만 저장되도록 스크립트에 필터를 구축하고 싶습니다.
스크립트가 MASA1로 시작하는 두 줄 사이의 전체 섹션을 작동하는 방식은 $0으로 처리됩니다.
if ($0~ /sh 실행/)
또는
if ($0~/sh 액세스 목록/)
여전히 10000줄 정도가 모두 인쇄됩니다.
스크립트를 좀 더 자세히 설명해야 할 것 같습니다...
sed -e '/# sh /{x;p;x};/\<changeto\>/d' MASA1
이렇게 하면 chnageto 줄을 제거하고 추가 줄로 구분된 섹션이 생성되도록 데이터 파일이 수정됩니다.
MASA1/pri/act/Context1# sh access-list [removed] MASA1/pri/act/Context2# sh run [removed] MASA1/pri/act/Context2# sh access-list [removed]
두 번째 부분...
awk -v RS= -F '[ ]|[#/]' '{if ($0~ /sh run/) {f=$1"_"$4"_run"; print > f} else {if ($0~ /sh access-list/) {f=$1"_"$4"_acl"; print > f}}}'
...줄에 sh run 명령이 있는 경우 파일 이름은 MASA1_Context1_run 또는 MASA1_Context2_run이 되고, sh access-list인 경우 파일 이름은 MASA1_Context2_acl이 됩니다. 이 명령의 파일 내용은 첫 번째 빈 줄까지 전체 [removed] 섹션이 됩니다.
내가 원하는 것은 0이 아닌 출력으로 파일을 생성하고 전체 [removed] 섹션이 아닌 이러한 특정 IP 주소와 일치하는 행만 출력하는 것입니다.
답변1
나도 이해하는지 잘 모르겠지만 이것이 당신에게 얼마나 도움이 될지:
awk '/changeto/ {CTX = $NF} /# sh/ {FN = CTX "_" $NF} !/MASA1/ {print > FN}' file