У меня длинный выполняемый сценарий, но я хочу иметь возможность прокручивать выходные данные stdout при выполнении

edit: изменил временную метку / tmp / begin, благодаря комментарию Стефана Чазеласа

man touch #find how to create a "begin" file JUST BEFORE Jan 1st of the year at 00:00:00.000
          #and a "end" file for JUST AFTER the Dec 31st of the year, at 23:59:59.999
  #usually, -t time 
  #   specifies a particular time using this format:
  #        [[[[cc]yy]MM]dd]hhmm[.ss]

#make sure you place those 2 files OUTSIDE of the place where you look for files, as they are themselves suceptible to be moved!

touch -t 200901010000.00 /tmp/begin  #1st Jan of 2009 at 00h00mn00s (note: files with that exact time will be not included!)
touch -t 201001010000.00 /tmp/end    #just after Dec 31st of 2009

#then: with '/orig' the starting folder you want to look in, and '/dest' the destination folder:
find /orig \( \( -newer /tmp/begin \) -a \( ! -newer /tmp/end \) \) -exec echo mv '{}' /dest \;

#and remove "echo" once you know it's just listing the relevant files
0
08.02.2019, 10:38
3 ответа

Вместо этого используйте массив, который позволит правильно индексировать переменные:

#!/bin/bash

declare -ai counters=(11 14)        # indexes start from 0
v1=()
v2=()    

for i in {1..2}; do
    v1[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter1="$counter" 'NR==counter1' | awk -F\" '{print $4}') 
    counters[0]+=7

    v2[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter3="$counter2" 'NR==counter3' | awk -F\" '{print $4}')
    counters[1]+=7

    echo "${v1[$i]}"
    echo "${v2[$i]}"
done

Возможно, вы могли бы поместить назначения vNв другой цикл for, чтобы уменьшить количество повторений.

Конечно, если вы не используете v1и v2ни для чего другого, кроме как для однократного отображения значений, вы можете просто запустить aws... | awkнапрямую и пропустить переменные и echo.

0
28.01.2020, 04:01

Я не знаю, что должен делать ваш код, но вот что он делает:

В первой итерации -, когда i равно 1 -, он объявляет переменные v11 и v12 и присваивает им что-то, а затем выводит $v1$i на экран.

v1 не существует -и $i является значением i, поэтому вы должны получить 'ничего' с добавленной 1 в качестве вывода в первом цикле:

А затем во второй итерации -, когда i равно 2 -дважды 2 по той же причине.

То, что вы делаете после знака равенства с awk и т. д., не имеет значения для результата.

Предложение использовать массив и использовать $i в качестве индекса в нем решит проблему.

0
28.01.2020, 04:01

Кажется, вы хотите вывести четвертое"-поле с разделителями в строках 11, 17, 18 и 21 вывода команды aws.

aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }'

Это вызывает awsодин раз вместо четырех раз и вызывает awkодин раз вместо восьми раз.

Если вы хотите это в массиве:

readarray -t output < <(
aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }' )

Массив outputтеперь будет содержать данные с одной строкой из awkв каждом элементе, начиная с индекса 0.

Если вы хотите разделить этот массив на два, чтобы получить элементы 0 и 2 в одном и 1 и 3 в другом:

v1=( "${output[0]}" "${output[2]}" )
v2=( "${output[1]}" "${output[3]}" )
0
28.01.2020, 04:01

Теги

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