Это уже достаточно оптимизировано. Трудно определить, в чем заключается "бутылочное горлышко", не зная больше деталей, например:
То, что вы можете сделать в любом случае:
-print | xargs
на -exec cmd {} +
или -print0 | xargs -r0
, если ваши find
/xargs
поддерживают это. -print | xargs
не только неверно, но и более дорого, поскольку xargs
должен декодировать символы, чтобы выяснить, какие из них являются пробелами, и выполнять дорогостоящую обработку кавычек. export LC_ALL=C
). Поскольку все символы, задействованные здесь (|
и десятичные цифры для содержимого файлов и латинские буквы, точка и знак подчеркивания для имен файлов) являются частью переносимой кодировки, если ваша кодировка UTF-8 или другая многобайтовая кодировка, переход на C с его однобайтовой кодировкой избавит от большого количества работы для find
и awk
. awk
до: awk -F "|" '$14 == "20160920100643" && $22 == "567094398953"'
. head
, вы можете отключить буферизацию вывода для awk
, чтобы он вывел эти 10 строк как можно раньше. В gawk
или mawk
для этого можно использовать fflush()
. Или вы можете добавить if (++n == 10) exit
в awk
. Подведем итоги:
(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -exec zcat {} + |
awk -F "|" '$14 == "20160920100643" && $22 == "567094398953" {
print; if (++n == 10) exit}')
Если "узким местом" является процессор, на многоядерной системе GNU можно попробовать:
(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -print0 |
xargs -r0P 4 -n 100 sh -c '
zcat "$@" |
awk -F "|" "\$14 == "20160920100643" && \$22 == "567094398953" {
print; fflush()}"' sh | head)
Запустить 4 задания zcat | awk
параллельно на партиях по 100 файлов.
Если 20160920100643
- это метка времени, вы можете захотеть исключить файлы, которые были последний раз изменены до этого. В GNU или BSD find
добавьте -newermt '2016-09-20 10:06:42'
.
Если строки имеют большое количество полей, вы получите штраф за то, что awk
разделит ее и выделит так много $n
полей. Использование подхода, учитывающего только первые 22 поля, может ускорить работу:
grep -E '^([^|]*\|){13}20160920100643(\|[^|]*){7}\|567094398953(\||$)'
вместо команды awk
. В GNU grep
добавьте опцию --line-buffered
для вывода строк как можно раньше при параллельном подходе или -m 10
для остановки после 10 совпадений при непараллельном.
Подведем итоги, если CPU является "бутылочным горлышком" и в вашей системе есть по крайней мере 4 ядра CPU, и есть по крайней мере 400 файлов muc*, и вы находитесь на системе GNU (где grep
обычно значительно быстрее, чем GNU awk
):
(export LC_ALL=C
find . -name "muc*_*_20160920_*.unl*" -newermt '2016-09-20 10:06:42' -print0 |
xargs -r0P 4 -n 100 sh -c '
zcat "$@" |
grep --line-buffered -E \
"^([^|]*\|){13}20160920100643(\|[^|]*){7}\|567094398953(\||$)"
' sh | head)
Обратите внимание, что при параллельном подходе вывод команд grep
может перемешаться (хотя при построчной буферизации и при условии, что размер строк не превышает нескольких килобайт, границы строк должны сохраняться).
Попробуйте:
# nmcli con add con-name "static-ens32" ifname ens32 type ethernet ip4 xxx.xxx.120.44/24 gw4 xxx.xxx.120.1
# nmcli con mod "static-ens32" ipv4.dns "xxx.xxx.120.1,8.8.8.8"
# nmcli con up "static-ens32" iface ens32
Далее найдите другие соединения и удалите их. Например:
# nmcli con show
NAME UUID TYPE DEVICE
ens32 ff9804db5-........ 802-3-ethernet --
static-ens32 a4b59cb4a-........ 802-3-ethernet ens32
# nmcli con del ens32
При следующей перезагрузке нужно поднять соединение static-ens32
, так как оно единственное доступное.
Индивидуальный IPv4-адрес / 32. / 24 обозначает сеть, которая в данном случае будет XXX.XXX.120. [0-255]. Попробуйте изменить запись ipv4.address
на XXX.XXX.120.44 / 32
и посмотрите, что произойдет. Если это не сработает, я должен задать тот же вопрос, который задан в комментариях - является ли NetworkManager обязательным требованием, или мы можем настроить адрес другими способами?
Замена /32 (single )на /24 (network )устранила мою проблему с назначением ipv4.addresses диапазона и первого IP-адреса.
Я думаю, что "вручную" может быть проблемой в вашем случае. Руководство может сказать nm вообще не управлять или не обрабатывать dhcp. Вы пробовали «общий», а затем ipv4.addresss, а не ipv4.address1? Или, если вручную, то ipv4.address1 может быть правильным вместо ipv4.addresses.
Вы заглядывали в /var/log/syslog? В моем случае dnsmasq сказал, что 32 слишком мало, а nmcli сообщил, что «слишком мало» в выводе ошибки.