но это запрашивает у меня пароль, хотя я был подключен через пару ключей.
Используя этот синтаксис, вы подключаетесь от первого хоста (не от вашего хоста) ко второму. Вы можете аутентифицироваться со своего хоста с помощью переключателя -3
, который обычно более удобен:
scp -3 source_user@source_remote_host:/usr/bin/mysql_backup.sh \
target_user@target_remote_host:/var/tmp/
Вам не хватает awk
решения. Вот одно, которое опускает нулевые элементы:
parse.awk
# Start with empty variables
{ d = h = m="" }
# Determine format and set variables accordingly.
# Force numeric interpretation by multiplying by one
NF==5 { d = $2*1; h = $3*1; m = $4*1 }
NF==4 { d = "" ; h = $2*1; m = $3*1 }
# Only set value if the number is greater than zero
{
d = d > 0 ? d "d" : ""
h = h > 0 ? h "h" : ""
m = m > 0 ? m "m" : ""
}
length(d h m) > 1 { print d h m }
length(d h m) == 0 { print "Now" }
Запустите его так:
awk -f parse.awk -v FS='[()+:]' file
Output:
2d5h10m
10h19m
45m
Похоже,
< file tr '+:)' dhm | tr -d '('
Сделал бы это. Или для более точного сопоставления с этим шаблоном:
sed 's/(\([0-9]\{1,\}\)+\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1d\2h\3m/g
s/(\([0-9]\{1,\}\):\([0-9]\{1,\}\))/\1h\2m/g' < file
Что с некоторыми реализациями sed
вы можете упростить, используя расширенные регулярные выражения, до:
sed -E 's/\(([0-9]+)\+([0-9]+):([0-9]+)\)/\1d\2h\3m/g
s/\(([0-9]+):([0-9]+)\)/\1h\2m/g' < file
Или с помощью одной команды s
с ] perl
:
perl -pe 's{\((?:(\d+)\+)?(\d+):(\d+)\)}{
($1 && "$1d") . "$2h$3m"}ge' < file
Или:
perl -pe 's/\((\d*\+?\d+:\d+\))/$1 =~ y|+:)|dhm|r/ge' < file
Простого (но немного неэффективного) perl-скрипта должно хватить
cat output_file | perl simple.pl
simple.pl
@seps=split /:/,"d:h:m";
while(<>) {
chomp ;
$_=~s/[\(\)]//g; #remove braces
@x = split /:/, $_; #get parts
$s="";
for($i=$#x,$j=$#sep;$i>=0; $i--,$j--) { #iterate on parts and corresponding separator
$s=$x[$i].$seps[$j].$s; #create print string
}
print "$s\n"; #print this line
}