Попробуйте awk
awk '
NR==FNR{
A[NR]=$1
limit=NR
next
}
/^avocado/{
i=i%limit+1
$1=A[i]
}
{
print
}
' newservers.lst servers.txt
Sed тоже можно:
sed '/^\s*\S\+\s*$/ { #match 1st file only
x #exchange line with holdspace
H #add pre-holdspace to pre-line
d #no print
} #result: reversed 1st file in holdspace
/^avocado/{
G #add holdspace to line
s/\S\+\(.*\)\n\(\w\+\)\n*$/\2\1/
#replace 1st word by last word(from holdspace)
P #print line before holdspace resedue
s/\s[^\n]*// #remove all from 1st word to holdspace
h #return holdspace with last word became first
d #no print
}
' newservers.lst servers.txt
Если я правильно понял, вы хотите запустить команды ssh, дождаться завершения и отправить почту в фоновом режиме. Это означает, что скрипт может завершиться до завершения работы ssh и почты.
Поэтому я бы предложил следующее решение:
#!/bin/bash
# Set to real file if you want "log output"
log_file=/dev/null
file_save=/whatever
command3=<some command here>
function exec_ssh
{
for i in $(cat $file_name); do
ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $i "echo -n $i;echo -n ',';$1" 2>/dev/null &
done >> $file_save
wait
mailx -s "Servers Command Output" -a $file_save <my mail_id@abc.com>
}
# export function, so it is callable via nohup
export -f exec_ssh $command3
# clear file_save
>$file_save
# run exec_ssh in the background.
# nohup keeps it running, even when this script terminates.
nohup exec_ssh &>$logfile &
# Inform user
echo " The output can be monitored in $file_save....................Please Be Patient"
echo "Mail will get triggered once completed"
exit 0
Функция exec _ssh выполняет всю работу и запускается в фоновом режиме с помощью nohup
. Таким образом, фоновое задание продолжает работать после завершения сценария или даже при закрытии терминала.
Я не знаю, что происходит, когда пользователь выходит из системы.
В качестве альтернативы
function doit () {
ssh -q -o "StrictHostKeyChecking no" -o "NumberOfPasswordPrompts 0" -o ConnectTimeout=2 $1 "echo -n $1;echo -n ",";$command3" 2>>/dev/null &
}
export -f doit
C=$(cat $file_name | wc -l)
cat $file_name | xargs -I {} -P $C bash -c "doit \"{}\"" >> $file_save
mailx -s "Servers Command Output" -a $file_save <my mail_id@abc.com>