Скрипт Bash ломается после оператора Continue

Используя 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позволит объявлять переменные в командной строке.
  • Настройте хеш, значениями которого являются typeglobs *pat1, *pat2.
  • Затем найдите pat1 во 2-м поле $F[1] и pat2 в 4-м поле $F[3], и только когда они оба будут найдены в одной и той же записи, эта запись должна быть напечатана.
1
18.06.2019, 21:50
2 ответа

Замените sshна ssh -n, чтобы остановить чтение из стандартного ввода (файла ips ).


См.:man ssh

1
27.01.2020, 23:30

Использование ssh -nдля перенаправления /dev/nullна стандартный ввод sshдолжно решить насущную проблему. Без -nsshбудет считываться из файла 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
1
27.01.2020, 23:30

Теги

Похожие вопросы