подождите, $!
- синтаксическая ошибка, отсутствует пробел. Здесь это не оказывает никакого влияния, потому что вы никогда не запускаете фоновое задание, поэтому $!
остается пустым, а команда wait
без аргументов, которая ожидает всех фоновых заданий - и поскольку их нет, она немедленно возвращается.
Есть разница между использованием wget --background…
и wget… &
. Первая команда сообщает wget
, что нужно разветвить дочерний процесс, а затем выйти:
(bash)
fork ——————————————→
wait exec wget --background …
⋮
⋮ fork ———————————————————————→
←—————————————— exit download
(next script line) ⋮
Когда родительский процесс wget
(который является передним планом) возвращается, bash возобновляет выполнение процесса. С помощью wget… &
оболочка создает фоновый процесс:
(bash)
fork ——————————————————→
(next script line) exec wget --background …
download
⋮
В этом случае вы можете дождаться завершения процесса wget:
wget … &
wait $!
Однако это бессмысленно: запуск фонового задания только для ожидания поскольку это эквивалентно запуску работы на переднем плане.
wget …
Я сделал описанным ниже способом
awk '/^loginName:/{x=NR+1}(NR<=x){print}' filename| sed "N;s/\n/ /g"| awk '$0 !~ /name[12]/{print $0}'
выход
loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083
Для этой задачи можно использовать AWK.
Первое решение с использованием аналогичной команды egrep
для исключения пользователей:
egrep -v 'loginName:(name1|name2)' FinalResults.txt | awk '/^loginName:/ { login=$0; } # save line
/^memoryInfo:jsHeapSizeLimit:/ {
if(login!="") { # only if we have a saved loginName line
printf "%s\t%s\n", login, $0;
login=""; # clear to avoid printing twice
}
}'
При вводе вопроса вывод
loginName:name3 memoryInfo:jsHeapSizeLimit:2181038084
loginName:name4 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name5 memoryInfo:jsHeapSizeLimit:2181038080
loginName:name6 memoryInfo:jsHeapSizeLimit:2181038083
Второе решение с расширенным скриптом AWK и списком исключений в отдельном файле
Предположим, вы создали файл exclude
со всеми пользователями для исключения, по одному в каждой строке
name1
name2
вы можете использовать расширенный сценарий AWK и предоставить файл exclude
в качестве первого файла перед файлом входных данных (s)
awk 'NR==FNR {# condition is valid for first file only
exclude[$0]=1; # add name to exclude map
next; # stop processing, do not check other rules
}
/^loginName:/ {
name=substr($0,11); # extract name
if (!( name in exclude )) login=$0; } # save line if not in exclude list
/^memoryInfo:jsHeapSizeLimit:/ {
if(login!="") { # only if we have a saved loginName line
printf "%s\t%s\n", login, $0;
login=""; # clear to avoid printing twice
}
}' exclude FinalResults.txt
Это дает тот же результат, что и первый сценарий AWK в сочетании с egrep
.