Эту проблему намного легче решить с AWK. Я протестировал это с GNU AWK; при использовании чего-то еще Вы, возможно, должны настроить его немного.
#!/usr/bin/gawk -f
BEGIN { FS = "|" }
{
split( $3, array, /,/ )
print $1 "," array[2]
print $1 "," $2 "," array[2]
print $1 "," $3
}
Сохраните сценарий где-нибудь (например, parse.awk) и удостоверьтесь, что это - исполняемый файл. Можно затем назвать сценарий на файле CSV или на стандартном входе и собрать результаты как это:
$ echo '1,3917,3917,BGP=694|Ethernet=1610|LAG=3,Y' | parse.awk
1,3917,3917,BGP=694,Y
1,3917,3917,BGP=694,Ethernet=1610,Y
1,3917,3917,BGP=694,LAG=3,Y
Настройки net.core.wmem_default
и wmem_max
управляют начальным и максимальным размером буферов TX-сокетов в байтах. В то время как сама очередь является всего лишь связанным списком указателей skb
, ядро также отслеживает общий размер байтов, потребляемых skb
по мере их добавления и удаления из буфера сокета. Сисктр wmem_default
устанавливает начальный потолок по умолчанию для новых сокетов (net/core/sock.c:sock_init_data()
). Приложениям разрешено увеличивать размер буферов своих сокетов и wmem_max
является потолком для этой функциональности (net/core/sock.c:sock_setsockopt()
).
Когда пакет удален из буфера сокета и проходит через стек сетей ядра, он помещается в очередь передачи, чтобы интерфейс ожидал загрузки на саму сетевую карту. Команды txqueuelen
, установленные командами ifconfig
или ip
, представляют собой количество фреймов, разрешенных на одну очередь передачи ядра для дисциплины очереди (net/sched/sch_generic.c:pfifo_fast_enqueue()
).
Наконец, эттул -G
использует ioctl для установки количества ринговых записей для кольцевого буфера на самой сетевой карте.
Я знаю, что должен дать длинное объяснение, но D Сеймон уже имеет . Вкратце txqueuelen
- это размер буфера. Все сетевые пакеты помещаются в этот буфер, тогда как tx
- это размер пакета IP-пакета, который попадает в указанный буфер. Это если я правильно понимаю этот пост.