Это ожидается, убедитесь, что вы понимаете параметр -t
( man sort
: разделитель полей). Команда, которую вы хотели использовать, работает только с обычными IP-адресами.
Быстрым и грязным решением может быть преобразование пробелов в точки .
сначала файл, а затем отсортируйте его (возможно, вы захотите отменить преобразование позже, за исключением IP-адресов).
sed -i.bak 's/ /./g' data.log
sort -n -t . -k2,2 -k3,3 -k4,4 -k5,5 data.log
Обратите внимание, что я сдвинул индексы. Попробуйте.
Файл fifo
— это просто тип файла, который при открытии как для чтения, так и для записи создает экземпляр канала, как это сделал бы системный вызов ()канала.
По крайней мере, в Linux данные, проходящие через этот канал, вообще не сохраняются в файловой системе (только в ядре в виде памяти ядра ). А атрибут size файла fifo не имеет значения и всегда равен 0.
В Linux вы можете изменить размер буфера канала (, независимо от того, был ли этот канал создан с помощью pipe()
или путем открытия файла FIFO )с помощью F_SETPIPE_SZ
fcntl()
, хотя для непривилегированных пользователей это связано по /proc/sys/fs/pipe-max-size
. Любой писатель или читатель канала может выдать это fcntl()
, хотя писателю имеет больше смысла делать это. В случае именованного канала вам нужно будет сделать это для каждого канала, созданного через файл fifo.
$ mkfifo fifo
$ exec 3<> fifo # instantiate the pipe
$ seq 20000 > fifo
^C # seq hangs because it's trying to write more than 64KiB
$ exec 3<&- 3<> fifo # close the first pipe and instantiate a new one
$ (perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576)'; seq 20000) > fifo
$ # went through this time
Выше я использовал perl
для выдачи fcntl()
, жестко закодировав значениеF_SETPIPE_SZ
(1031 в моей системе ).