Используя GNU sed
вы можете выполнить поставленную задачу:
# bash function to properly escape the variable contents
# s.t. it can be used on the LHS of a sed s/// command
escVar() {
printf '%s\n' "$1" | sed -e 's:[][^\./$*]:\\&:g'
}
# now define your patterns to be used
pat1=$(escVar "$DC")
pat2=$(escVar "$CountryCpde")
# main...
sed -Ee '
h;s/[^,]+/\n&\n/2; s/[^,]+/\n&\n/4'"
/\n.*$pat1.*\n.*\n.*$pat2.*\n/"'!d;g
' filename.csv
Также вы можете использовать Perl
для этой задачи:
perl -F, -slane '
BEGIN{ @h{qw/1 3/} = (*pat1, *pat2); }
print if 2 == grep { 1 + index $F[$_], ${$h{$_}} } qw/1 3/;
' -- -pat1="$DC" -pat2="$CountryCode" -- filename.csv
-n
), -s
позволит объявлять переменные в командной строке. Замените ssh
на ssh -n
, чтобы остановить чтение из стандартного ввода (файла ips ).
См.:man ssh
Использование ssh -n
для перенаправления /dev/null
на стандартный ввод ssh
должно решить насущную проблему. Без -n
ssh
будет считываться из файла ips
. Но есть и другие ненужные вещи, которые вы делаете в своем коде.
Исправлен код:
while read ip name; do
(
while true; do
if ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
printf 'Process is running on %s\n' "$ip"
sleep 10
else
printf 'Process is not running on %s\n' "$ip"
echo 'I run some other commands here'
break
fi
done
) &
done <ips
wait
Я немного упростил ваш код на
top
на удаленном хосте, awk
непосредственно с помощью if
, break
для выхода из (теперь )бесконечного цикла, if
и wait
без каких-либо аргументов для ожидания всех фоновых процессов. Другой вариант, который устраняет необходимость в утверждении if
все -вместе:
while read ip name; do
(
while ssh -n "ubuntu@$ip" top -b -n2 -d 0.5 | awk '/Cpu/ && n++ { exit($2+$4 > 1) }'
do
printf 'Process is running on %s\n' "$ip"
sleep 10
done
printf 'Process is not running on %s\n' "$ip"
echo 'I run some other commands here'
) &
done <ips
wait