awk는 패턴이 일치하면 인쇄를 시작하고 두 번째 패턴이 발견되면 인쇄를 중지합니다.

awk는 패턴이 일치하면 인쇄를 시작하고 두 번째 패턴이 발견되면 인쇄를 중지합니다.

내가 원하는 것은 awk일치하는 패턴을 사용하고, 특정 열을 인쇄하고, 다른 패턴이 발견되면 중지하는 것입니다.

예를 들어

다음 내용이 포함된 파일이 있습니다.

Enter-PSSession -ComputerName ACD-VMH04 -Credential afornito

Name       State   CPUUsage(%) MemoryAssigned(M) Uptime     Status
----       -----   ----------- ----------------- ------     ------
ACD-CMS03  Running 0           4096              9.14:40:30 Operating normally
ACD-FFS01  Running 0           8192              9.14:31:22 Operating normally
ACD-FS01   Running 0           3072              9.14:31:28 Operating normally
ACD-WP01   Running 15          4096              9.14:31:33 Operating normally
ACP-DEV-01 Running 0           4096              9.14:31:13 Operating normally
VMDEV01    Running 0           2048              9.14:31:48 Operating normally

Get-VMProcessor |  Select-Object VMName, Count

VMName                                                                                                            Count
------                                                                                                            -----
ACD-CMS03                                                                                                             2
ACD-FFS01                                                                                                             1
ACD-FS01                                                                                                              2
ACD-WP01                                                                                                              2
ACP-DEV-01                                                                                                            2
VMDEV01                                                                                                               2

Get-VMMemory

VMName     DynamicMemoryEnabled Minimum(M) Startup(M) Maximum(M)
------     -------------------- ---------- ---------- ----------
ACD-CMS03  False                512        4096       1048576
ACD-FFS01  False                512        8192       1048576
ACD-FS01   False                512        3072       1048576
ACD-WP01   False                512        4096       1048576
ACP-DEV-01 False                512        4096       1048576
VMDEV01    True                 2048       2048       4096

이제 처음 몇 줄의 이름, 상태, 할당된 메모리 및 상태를 인쇄하고 싶습니다.

각 파일의 레이아웃이 동일하므로 첫 번째 파일을 시작하기 쉽습니다.

awk 'NR>=5&&NR<=10 {print $1, $2, $4, $5}' stats.txt

내가 원하지 않는 것은 "<=10" 부분입니다. "Get-VMProcessor"가 보일 때 이를 중지하려면 무엇을 사용할 수 있습니까?

2부 "Select-Object VMName, Count"가 발견된 경우 인쇄를 시작하는 방법 3줄을 건너뛰고 "Get-VMMemory"를 찾을 때까지 인쇄합니다.

답변1

많은 기술이 있습니다.

"Get-VMProcessor"가 표시될 때 처리를 중지하려면 다음을 종료하면 됩니다.

awk '/Get-VMProcessor/ { exit }; NR>=5 { print $1, $2, $4, $5 }' stats.txt

보다 일반적인 해결책은 출력 플래그를 사용하는 것입니다.

awk 'NR == 5 { output = 1 }; /Get-VMProcessor/ { output = 0 }; output { print $1, $2, $4, $5 }' stats.txt

이것을 출발선과 결합하여 두 번째 블록을 처리할 수 있습니다.

awk 'NR == 5 { output = 1 }; /Get-VMProcessor/ || /Get-VMMemory/ { output = 0 }; /Select-Object VMName, Count/ { output = 1; start = NR + 4 }; output && NR >= start { print $1, $2, $4, $5 }' stats.txt

답변2

awk에는 시작 및 중지 모드가 내장되어 있습니다.

awk '/startpattern/,/stoppattern/'
awk '/Name/,/Get-VMProcessor/'

관련 정보