Есть несколько слоев, в которых вы можете запросить последнюю команду.
Строковый редактор (, в котором вы вводите свои команды ), предоставляется непосредственно ksh, библиотекой readline в bash и библиотекой zle в zsh. Другие оболочки, такие как dash, могут не иметь библиотеки редактирования для понимания этих клавиш (, если они не скомпилированы с включенной опцией --with-libedit
).
Эта работа в ksh, bash, zsh:
Ctrl-P#Режим Emacs (предыдущий)
Ctrl-N#Режим Emacs (далее)
ESC-k#режим vi ESC для перехода в командный режим и k для перехода вверх
ESC-j#режим vi ESC для перехода в командный режим и j для перехода вниз
Система истории, предоставляемая многими оболочками, позволяет расширять некоторые ярлыки:
!! # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1 # bash and zsh only
Есть некоторые команды, которые могут извлекать команды из истории.
Подобно довольно подробной команде (, только для печати):
history 2 | head -n-1
или старая и поэтому обычно более переносимая fc
команда (непосредственно повторно -выполняется):
fc -e - -1
Или проще fc -s -1
, но zsh не принимает такой вариант для fc.
Если вы хотите только напечатать команду, используйте:fc -nl -1 -1
.
Для редактирования установите FCEDIT
текстовый редактор (ex, ed, emacs, vi и т. д. )и используйте fc напрямую:fc -1
.
Если я хочу выполнить быструю проверку уникальности всех объектов в массиве clientId
, я бы использовал jq
только для вывода этого значения и проверки в оболочке.
< file.json jq '.rootLevel[].clientId' | awk '
seen[$0]++ {print "FAILURE"; f=1; exit}
END {if (!f) print "SUCCESS"}'
Вы также можете сделать это с jq
, комбинируя length
, unique
, unique_by
или другие функции, man jq
для большего.
Если вы хотите напечатать все объекты, имеющие дубликаты .clientId
, вы можете сделать это:
jq '.rootLevel | group_by(.clientId) | map(select(length>1))' file.json
group_by
создаст отдельные массивы на clientId
, и мы выберем только те, у которых более одного элемента, то есть те, которые дублируют clientId
. Или вы можете добавить функцию длины для их подсчета (еще один способ проверить, являются ли значения уникальными):
jq '.rootLevel | group_by(.clientId) | map(select(length>1)) | length' file.json
Если я хочу проверить, что все объекты этого массива json имеют поле .processId
, я бы сделал это:
jq '.rootLevel[] |.processId?' file.json | grep -m1 null
и проверьте статус выхода grep. Это значит:
if jq '.rootLevel[] |.processId?' file.json | grep -qm1 null; then
echo "FAILURE"
else
echo "SUCCESS"
fi
Сочетая приведенные выше указания, вы можете сделать все, что вы упомянули в своем вопросе.
Если у вас много работы с похожими вещами, рассмотрите возможность использования «База данных JSON» (или «База данных документов» или «База данных Nosql» ).