@rush использование sed
не работало в моей оболочке, поэтому я пошел по этому пути
grep -Poh '(?<=login":")[^"]*' json* | sort | uniq -c | awk -v OFS=': ' 'BEGIN{print "{"}{print $2, $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g;s/:/\":/g;s/^([^{}])/\"\1/g'
Множественное число sed
можно изменить, если ваша оболочка позволяет экранировать "
и печатать их в операторе awk
.
grep -Poh '(?<=login":")[^"]*' json* | sort | uniq -c | awk -v OFS=': ' 'BEGIN{print "{"}{print \"$2\", $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g'
У меня в оболочке awk
подавился \"
во втором скрипте. Не уверен, почему, но уверен, что кто-то там скажет мне.
Я также пробовал jq
, но он задыхался от файлов json. Синтаксическая ошибка
"this":"is' #is written so I edited these to
"this":"is"
Также jq
не понравилась конструкция
{"a":"strange"} # so I also edited these to
b: {"a":"strange"}
Если исходные файлы должны соответствовать внесенным изменениям, тогда jq
работает
jq '.login' json* | sort | uniq -c | awk -v OFS=': ' 'BEGIN{print "{"}{print $2, $1}END{print"}"}' | sed -E 's/([0-9])$/\1,/g'
Причина, по которой это происходит, заключается в том, что включение управления заданиями(set -m
)приводит не только к группированию процессов, но и к механизму обработки «передних» и «фоновых» заданий. Этот «механизм» подразумевает, что каждая команда, выполняемая по очереди, пока включено управление заданиями, становится группой процессов переднего плана.
Таким образом, вкратце, когда эта вспомогательная -оболочка (в левой части вашего конвейера )включает управление заданиями, она буквально крадет терминал из всего конвейера, в котором он был до этого и который, в вашем например, включает процесс less
, что делает его фоновым и, таким образом, не позволяет больше использовать терминал. Поэтому он останавливается, потому что less
продолжает обращаться к терминалу.
Выдав fg
, вы возвращаете терминал всему конвейеру, следовательно, less
, и все заканчивается хорошо. Если вы не запускаете дополнительные команды в рамках задания -, управляющего оболочкой sub -, потому что в этом случае каждая дополнительная команда снова захватит терминал.
Один из способов обойти это — просто запустить вашу работу -контролируемую подпрограмму -подпрограмму -оболочку в фоновом режиме:
( set -m; (
$1
) & set +m ) |
(
$2
)
У вас будет команда, выраженная $1
, которая будет выполняться в отдельной группе процессов, как вы пожелаете, в то время как фоновый режим предотвращает кражу терминала, таким образом оставляя его конвейеру и, следовательно, $2
.
Естественно, это требует, чтобы команда в $1
не хотела читать сам терминал, иначе он будет остановлен, как только попытается это сделать.
Кроме того, подобно тому, как я сказал выше,любое дополнительное задание -контролируемое подчиненное -подчиненное -оболочка, которое вы, возможно, захотите добавить, потребует такой же «фоновой» обработки до тех пор, пока вы set +m
, в противном случае каждое дополнительное задание -контролируемое подчиненное -оболочка sub -снова украдет терминал.
Тем не менее, если все, для чего вам нужна группировка процессов, — это уничтожение процессов, вы можете рассмотреть возможность использования pkill
для их нацеливания. Например, pkill -P
отправит сигнал процессам, чей родительский является указанным PID. Таким образом, вы можете ориентироваться на всех дочерних (, но не на старших -дочерних )вашего подпроцесса -, просто зная PID подпроцесса -.