Введение времени ожидания в UNIX сценария оболочки для каждого n выполнений - PullRequest
1 голос
/ 12 июля 2020

У меня есть 2 файла: file.dat и mapping.dat .

file.dat содержит записи (может содержать дубликаты) , а mapping.dat - это файл stati c, который содержит записи и соответствующие им имена сеансов / заданий, разделенные запятой. Я разработал простой сценарий UNIX Shell, который запускается в l oop, где для каждой записи в file.dat он ищет имя сеанса / задания в mapping.dat и отображает результат.

Содержимое file.dat

ekm
ckm
cnc
cnx
ekm
hnm
dam

Содержимое mapping.dat

#Entry,Job_Name#

ckm,BDSCKM
cnc,BDSCNC
cnx,BDSCNX
ekm,BDSEKM
azm,BDSAZM
bam,BDSBAM
cam,BDSCAM
oid,BDSOID
hnm,BDSHNM
dam,BDSDAM

Текущий сценарий:

#!/bin/ksh
for FILE in `cat file.dat`
do
        SESSION=`grep $FILE mapping.dat | cut -d, -f2`
        echo "For ${FILE}, Session launched is: ${SESSION} "
done

Текущий выход

For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM 
For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX
For ekm, Session launched is: BDSEKM 
For hnm, Session launched is: BDSHNM 
For dam, Session launched is: BDSDAM 

Мой вопрос: я хочу ввести время ожидания / сна для каждых 2 появлений вывода, т.е. сначала должно отображаться

For ekm, Session launched is: BDSEKM 
For ckm, Session launched is: BDSCKM

подождите 90 секунд , а затем

For cnc, Session launched is: BDSCNC 
For cnx, Session launched is: BDSCNX

.. и так далее

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Вот как я бы это сделал, я добавил в сообщение о нераспознанных элементах (вы можете безопасно удалить это, просто удалив || session='UNRECOGNIZED' из первой строки while read l oop). Я не слишком хорошо знаком с k sh, но считаю, что read в этом контексте то же самое, что bash (я очень хорошо знаком с bash).

Я тестировал с вашим пример данных, и он работает как с ksh, так и с bash.

#!/bin/ksh
# Print 2 mappings every 90 seconds

FILE="./file.dat"
MAP="./mapping.dat"

while IFS= read -r line; do
        session=$(grep "$line" "$MAP") || session='UNRECOGNIZED'
        echo "For $line, session launched is: ${session#*,}"
        ((count++ % 2)) && sleep 90
done < "$FILE"

Я использовал не жадное удаление суффикса (#), чтобы изолировать «сеанс».

1 голос
/ 12 июля 2020

Попробуйте помочь себе с помощью оператора по модулю %.

#!/bin/ksh
count=1
for file in $( cat file.dat )
do

  session=$( grep $file mapping.dat | cut -d, -f2 )
  echo "For ${file}, session launched is ${session}."

  if (( count % 2 == 0 ))
  then
    sleep 90
  fi
  (( count++ ))
done
0 голосов
/ 13 июля 2020

Чтобы напечатать первые 2 строки подряд, затем подождите 90 секунд, затем распечатайте следующие 2 строки, et c. Используйте оператор по модулю %, предложенный Тони Старком. Счетчик инициализировать не нужно.

#!/bin/bash
for file in $( cat file.dat )
do
  session=$( grep $file mapping.dat | cut -d, -f2 )
  echo "For ${file}, session launched is ${session}."
  (( count++ % 2 )) && sleep 90
done
...