Команды скриптов awk в Linux

Вопрос или проблема

Я работаю над проектом по извлечению информации о сети из tcpdump, который требует множества команд awk для форматирования перед импортом в базу данных, используемую для отчетности, т.е.:
tcpdump -tttt -vi any -c 100 | grep -v "Date:$(date +%F)\$" | awk '/^ +/{$1=$1;print q, $0; next} {q=$0}' | awk '{gsub(/\(|\)|>|,/, ""); print}' | awk '{$1=$1}1' OFS="," | awk -F ',' -v OFS=',' '$27=="incorrect" { for(i = 28; i < NF-1; i++) $i = $(i+4); NF -= 4 } { print }'| awk nnnn (больше команд awk) > tcpdump.csv .

Я создал так много команд awk (более 20), что теперь awk не может полностью выполнить их (по крайней мере на моем компьютере), и мне нужно 2 отдельных группы команд в пайпах. Я новичок в awk, но исследования показывают возможность добавлять/вызывать команды awk последовательно в awk-скрипте вместо командной строки пайпа… возможно ли это и если да, то как команды выше и ниже следует оформить в файле awk-скрипта:
awk nnnn (больше команд awk) tcpdump.csv | awk -F, -v OFS=',' '{sub(/\.localdomain/,"")} 1'| awk -F, -v OFS=',' '{sub(/\.:.*/,"",$25)} 1' | awk -F, -v OFS=',' '{sub(/\.\..*/,"",$25)} 1' | awk -F, -v OFS=',' '{sub(/localhost\.localdomain.*/,"localhost",$25)} 1' | awk -F, -v OFS=',' '{ gsub(/[^0-9]/,"",$23) }1' | awk 'BEGIN { FS =","; OFS = ","} {for (i = 24; i <= 24; i++) { $i = "" }; print}' > tcpdumpworking.csv

Благодарю заранее за обзор и помощь.

Ответ или решение

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

Ниже приведен пример, как можно переписать ваши команды в скрипт awk. Создайте файл, например tcpdump_script.awk, и вставьте в него следующий код:

BEGIN {
    FS = ",";
    OFS = ",";
}

# Первое условие для обработки входных данных.
{
    # Удаляем стереотипные строки, если они соответствуют дате
    if ($0 ~ "Date:" date) {
        next;
    }

    # Обработка данных
    if (length($0) > 0) {
        if ($27 == "incorrect") {
            for (i = 28; i < NF - 1; i++) {
                $i = $(i + 4);
            }
            NF -= 4;
        }

        # Обработка удалений и замены
        gsub(/\(|\)|&gt;|,/, "", $0);
        $1 = $1;  # Удаление лишних пробелов

        # Прочие модификации полей
        sub(/\.localdomain/, "", $25);
        sub(/\.:.*/, "", $25);
        sub(/\.\..*/, "", $25);
        sub(/localhost\.localdomain.*/, "localhost", $25);
        gsub(/[^0-9]/, "", $23);

        for (i = 24; i <= 24; i++) {
            $i = "";
        }

        print;
    }
}

Теперь вы можете использовать этот скрипт в вашем конвейере команд следующим образом:

tcpdump -tttt -vi any -c 100 | grep -v "Date:$(date +%F)" | awk -v date="$(date +%F)" -f tcpdump_script.awk > tcpdump.csv

Для второй части вашего скрипта, если у вас есть еще какие-то команды awk, вы можете добавить их в тот же файл или создать новый скрипт.

Преимущества использования скрипта awk:

  1. Читаемость: Скрипт будет значительно легче читать и понимать.
  2. Поддерживаемость: Проще вносить изменения и дополнения.
  3. Производительность: Уменьшение накладных расходов, связанных с запуском нескольких процессов awk.

Обратите внимание, что вы можете добавлять любые дополнительные команды в тот же файл tcpdump_script.awk и обрабатывать их в одном вызове awk.

Надеюсь, это поможет вам упростить ваш процесс и повысить его эффективность. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...