awk показать последние 2-3 поля строки

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

awk показать последние 2-3 поля строки

Сообщение bars »

Привет.
Подскажите пожалуйста, как мне с помощью awk посмотреть в строке последние 2-3 поля.

Код: Выделить всё

awk '/HTTP\/1.[0-3]" 200/ {print $1,$(NF-1),$NF}' /var/log/nginx/acces.log
Как то коряво смотрится команда, просмотра 1, предпоследнего и последнего поля строки.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
chitatel
Сообщения: 2063

Re: awk показать последние 2-3 поля строки

Сообщение chitatel »

ИМХО, awk сам по себе выглядит коряво. Зато работает и практически повсеместно есть из коробки.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 940
ОС: BSD/LINUX
Контактная информация:

Re: awk показать последние 2-3 поля строки

Сообщение bars »

А если допустить, нужно просмотреть строку с конца, 1,2,3,4,5 поля, и т.д.$(NF-3),$(NF-2),$(NF-1),$NF как то коряво, куда было бы лучше указать диапазон полей с конца к примеру $(NF1-5) как то так ).
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20799
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: awk показать последние 2-3 поля строки

Сообщение Bizdelnick »

Нормально всё смотрится.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: awk показать последние 2-3 поля строки

Сообщение olecya »

bars писал:
17.08.2023 12:14
Как то коряво смотрится команда,
Это если не понимать что происходит. NF целочисленная беззнаковая переменная определяет количество полей в записи. Например, 5, а значит поле $4 это то же самое что $(NF-1) и $(5-1)
bars писал:
20.08.2023 09:29
куда было бы лучше указать диапазон полей с конца к примеру $(NF1-5) как то так ).
Это же процессор и целый язык программирования - ваш конструктор. Напишите функцию, например:

Код: Выделить всё

#!/bin/bash
awk '
function vec(start, end) {
        k = start>end?-1:1
        for(i=start; i!=end; i+=k) {
                printf("%s%s", $i, OFS)
        }
        printf("%s%s", $i, ORS)
}
        {vec(5, 3)}
        {vec(3, 5)}
' file
P.S Не проверяла во FreeBSD. GNU awk only
Добавлено (16:32):
Функции можно записать в отдельном файле и подключать соответственно:
cat funcs:

Код: Выделить всё

function vec(start, end) {
	k = start>end?-1:1
	for(i=start; i!=end; i+=k) {
		printf("%s%s", $i, OFS)
	}
	printf("%s%s", $i, ORS)
}

Shell

awk -i funcs '{vec(3,5); vec(5,3)}' file
Так же возможно создать отдельную директорию для библиотечных функций и прописать в файле конфигурации оболочки путь к ней через переменную AWKPATH

Shell

mkdir lib
mv funcs lib
export AWKPATH=$PWD/lib
awk -i funcs '{vec(3,5); vec(5,3)}' file
Спасибо сказали:
Ответить