Я пытаюсь использовать 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»?
Вторая часть, как я могу начать печать при обнаружении «Select-Object VMName, Count» пропускает 3 строки и печатает, пока не найдет «Get-VMMemory».
Существует ряд приемов.
Если вы хотите просто остановить обработку, когда увидите «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
awk имеет встроенный шаблон старт-стоп:
awk '/startpattern/,/stoppattern/'
awk '/Name/,/Get-VMProcessor/'