Вопрос или проблема
Я работаю над проектом по извлечению информации о сети из 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(/\(|\)|>|,/, "", $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
:
- Читаемость: Скрипт будет значительно легче читать и понимать.
- Поддерживаемость: Проще вносить изменения и дополнения.
- Производительность: Уменьшение накладных расходов, связанных с запуском нескольких процессов
awk
.
Обратите внимание, что вы можете добавлять любые дополнительные команды в тот же файл tcpdump_script.awk
и обрабатывать их в одном вызове awk
.
Надеюсь, это поможет вам упростить ваш процесс и повысить его эффективность. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!