Используйте awk
и :
в качестве разделителя полей. Затем вы можете сохранить каждое уникальное сообщение об ошибке (которое будет шестым полем) в массиве и распечатать только первое вхождение:
$ awk -F: '!a[$6]++' file
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
Приведенный выше сценарий сохранит каждую строку как запись в ассоциативном массиве a
только в том случае, если для 6-го поля еще не сохранено значение (! a [$ 6]
). Поскольку действие по умолчанию в awk
состоит в том, чтобы печатать, когда что-то оценивается как истина, в результате будут напечатаны только первые уникальные вхождения.
Если вы хотите сделать это только для строк, соответствующих dns
, используйте:
awk -F: '!a[$6]++ && /dns/' file
Что касается игнорирования первых 11 строк, вы можете сделать это с помощью:
grep dns file | tail -n +12
#compdef foo
local ret=1
_arguments \
'1:first:(a b c)' \
'*:files:_files' \
&& ret=0
return $ret
завершаетa
b
или c
для меня, а затем тестирует как минимум два файла. Изменение обработчика первого аргумента
'1: :($(print -l a b c))' \
у меня тоже работает. Если у вас есть пробелы в выводе того, что делает ваша программа, это будет проблемой для завершения первого аргумента, но не нарушит завершение последующих файлов для меня:
'1: :($(< ~/tmp/opts))' \
, а затем:
% print -l "a b" c d > ~/tmp/opts
% rm ~/.zcompdump
% exec zsh -l
% foo
a b c d
он представляет a
или b
, а неa b
:обычно вместо этого можно увидеть такие вещи, как ${(f)"$(...)"}
, для разделения только на новые строки, cd $fpath[-1]
обычно ZSH предоставляет скрипты завершения для изучения.
Но я не могу воспроизвести утверждение «не работает завершение файлов»; возможно с полным скриптом завершения и подходящим выходом из программы?
Обратите внимание на команды rm ~/.zcompdump ; exec zsh -l
, которые удаляют кеш завершения и запускают новый экземпляр ZSH. Менее навязчивой альтернативой может быть конкретная выгрузка по конкретному имени команды:
function zbouncecompdef { unfunction _$1; autoload -U _$1; }