печать предыдущего поля в AWK - PullRequest
1 голос
/ 16 марта 2011

Я думаю, что awk будет решением моей проблемы. Мои инструменты ограничены, потому что я использую busybox на ESXi 4.0u1. У меня есть файл журнала из программы резервного копирования ВМ (ghettoVCB). Мне нужно отсканировать этот файл на выражение

"Не удалось клонировать диск: в файловой системе недостаточно места для выбранной операции"

В моем файле это около строки '43'. Предыдущее поле (в словаре AWK) представляет имя виртуальной машины, которую я хочу print для выходного текстового файла. В моем примере имя виртуальной машины: TEST12-RH4-AtlassianTest.

awk 'RS=""
/There is not enough space/ { 
print $17
} '

print $17 жестко запрограммирован, и я этого не хочу. Я хочу найти поле, которое на единицу меньше, чем первое поле в строке, возвращаемой регулярным выражением выше. Любые предложения приветствуются. [Входной файл Awk]

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Обновление (оптимизированная версия)

awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt

Подтверждение концепции

$ awk 'NR==1{print $NF}' RS="Failed to clone" input-awk.txt
TEST12-RH4-AtlassianTest

Обновление 2 ( Uber оптимизированная версия)

Технически, следующая версия будет оптимизирована для uber , но она оставляет слишком много шансов для ложных попаданий в разделитель записей, хотя это работает для вашего образца ввода.

awk 'NR<2{print $NF}' RS="Fa" input-awk.txt`

Обновление 3 (Ultimate, оптимизированная для мега-убийств)

Я бы не стал использовать это в рабочем коде, но он просто показывает, что всегда есть способ сделать его проще.Если кто-то может победить это для кода гольфа целей, я, безусловно, хотел бы увидеть это!

awk '!a++,$0=$NF' RS="Fa" input-awk.txt

Оригинал

Предполагая, что имя вашей виртуальной машины всегдапоследнее поле в записи, которую вы хотите напечатать, это работает:

awk '/not enough space/{split(pre,a);print a[pNF]}{pre=$0;pNF=NF}' input-awk.txt
0 голосов
/ 16 марта 2011

Так что вы не могли бы использовать что-то вроде

'{if it matches, print foo; foo=$17}'
...