У меня есть сотни журналов, разбросанных по нескольким тысячам виртуальных машин, и я пытаюсь создать несколько скриптов для быстрого сканирования журналов. Я разобрался с большей частью презентации и хотел бы узнать, есть ли простой способ использовать что-то вроде awk, printf и т. д., которые я знаю, как использовать, но конкретно для вывода итерированного диапазона значений из файлов журналов?
Пример:
awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.
Я знаю, как правильно использовать awk, форматировать, разделять и т. д. выводимые данные, но подумал, что было бы неплохо указать диапазон полей, которые я хотел бы вывести на печать.
Я обновлю свой вопрос, если разберусь, как это сделать с помощью предложенных похожих вопросов и/или самостоятельно.
Спасибо!
EDIT: Я знаю, как вручную напечатать $1 $2 $3, но не включил это в свой пример.
ПРАВКА 2: Я также знаю, как подсчитать количество полей с помощью awk, используя NF, чтобы впоследствии сделать диапазон динамическим, что является моей долгосрочной целью.
решение1
Диапазоны, начинающиеся с первого поля
Давайте рассмотрим этот тестовый файл:
$ cat input.csv
a,b,c,d,e,f,g,h,i,j
По крайней мере с помощью GNU awk мы можем вывести первые пять (или другое количество) полей следующим образом:
$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e
Для тех, кто ценит краткость выше ясности, мы могли бы написать так:
$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e
Динамическое изменение размера
Чтобы пропустить последние два поля, независимо от того, сколько полей им предшествует:
$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h
Другие диапазоны
Для печати начала и окончания с произвольными полями необходим цикл:
$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f
Для печати с третьего поля и динамического исключения последних двух полей:
$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h
решение2
Небольшое замечание: awk
это гораздо более гибко, но если вам нужен только определенный диапазон полей, используйте cut
:
cut -d, -f1-5 huge_log_file.csv
Это гораздо проще, чем awk
цикл, если это все, что вам нужно.