Вывод команды на консоль и grep для подтверждения статуса успеха - PullRequest
1 голос
/ 19 февраля 2020

Я запускаю сценарий python, который создает задание потока данных облака Google. Команда выглядит следующим образом:

python -m runpipline <command_options ...>

Вывод этой команды показывает, было ли задание успешно создано или нет. В случае успешного создания команда заканчивается следующим образом:

INFO:apache_beam.runners.dataflow.internal.apiclient:Create job: <Job
 createTime: '2020-02-18T20:39:44.885028Z'
 currentStateTime: '1970-01-01T00:00:00Z'
 id: '2020-02-18_12_39_43-1111111111111111111'
 location: 'us-central1'
 name: '<name_of_the_job>'
 projectId: '<project_name>'
 stageStates: []
 startTime: '2020-02-18T20:39:44.885028Z'
 steps: []
 tempFiles: []
 type: TypeValueValuesEnum(JOB_TYPE_STREAMING, 2)>
INFO:apache_beam.runners.dataflow.internal.apiclient:Created job with id: [2020-02-18_12_39_43-1111111111111111111]
INFO:apache_beam.runners.dataflow.internal.apiclient:To access the Dataflow monitoring console, please navigate to https://console.cloud.google.com/dataflow/jobsDetail/locations/us-central1/jobs/2020-02-18_12_39_43-1111111111111111111?project_name%  

Этот скрипт выполняется действием github и использует ubunt-latest image. То, что я хочу сделать, это

  1. Вывод команды должен быть напечатан на консоль, и я должен иметь возможность извлечь job_id из команды
  2. Если я могу извлечь работу ID, я должен быть в состоянии сделать следующую команду X.
  3. Если job_id не существует, то я должен выполнить скрипт.

Я использовал grep, чтобы сделать это python -m runpipline <command_options ...> | grep -E "\d{4}-\d{2}-\d{2}_\d{2}_\d{2}_\d{2}-\d{19}\]", но это не позволило бы мне выводить данные на консоль. Кроме того, это просто дает мне линию, которая соответствует этому критерию. не идентификатор работы. Так что не уверен, что делать

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Не могли бы вы попробовать следующее:

id=$(python -m runpipline <command_options ...> | tee /dev/tty | grep -Po "id:\s*\[\K\d{4}-\d{2}-\d{2}_\d{2}_\d{2}_\d{2}-\d{19}(?=])")

if [[ -n $id ]]; then
    : # do your command here
else
    echo "grep failed"
fi
  • Он ищет в выводе python идентификатор, которому предшествует строка id: [, за которой следует ].
  • Благодаря косвенному утверждению, переменной * назначается только часть идентификатора id.
  • Вы можете продолжить свою задачу, используя результат.

[ РЕДАКТИРОВАТЬ]
Если ваш grep не поддерживает параметр -P, попробуйте следующее:

id=$(python -m runpipline <command_options ...> | tee /dev/tty | grep -Eo "id:[[:blank:]]*\[[[:digit:]]{4}(-[[:digit:]]{2}){2}(_[[:digit:]]{2}){3}-[[:digit:]]{19}]")

if [[ -n $id ]]; then
    id=$(sed 's/^id:[[:blank:]]*\[\(.\+\)]/\1/' <<< "$id")      # remove leading and trailing extra substrings
    echo "grep passed. Id=$id"
else
    echo "grep failed"
fi
1 голос
/ 19 февраля 2020

Так как у нас нет того API, который генерирует показанный вами результат, поэтому мы не проверили его полностью, не могли бы вы попробовать один раз.

cat script.ksh
OUT_FILE="/complete_path/output_file"
python -m runpipline <command_options ... > "$OUT_FILE"
if [[ -s "$OUT_FILE" ]]
then
     cat "$OUT_FILE"
     JOB_ID=$(grep -ioP ".*Created job with id:\s+\[\d{4}-\d{2}-\d{2}_(\d{2}_){2}\d{2}-\K(\d+)(?=])"  "$OUT_FILE")
     if [[ -n "$JOB_ID" ]]
     then
          echo "Run your further programs here......"
     else
          echo "Looks like NO job id found, exiting from script now... bye!!"
          exit 1
     fi
else
     echo "Please check your Python program has NOT created output file."
     exit 1
fi


Что делает скрипт?

  • Скрипт имеет BASH переменную с именем OUT_FILE, значение которой равно ЗАВЕРШЕНУ ПУТИ вашего файла с именем файла, в котором мы хотим сохранить вывод вашей команды Python.
  • Затем он запускает ваш упомянутый Python API (вы можете заполнить полную команду там, я только использовал пример, предоставленный вами в ваших примерах).
  • Он сохраняет выходные данные этого файла в output_file по заданному вами полному пути.
  • Теперь наступает условие if, которое проверяет, имеет ли output_file размер, означает NOT NULL size, затем идет дальше, в противном случае выходит из сценарий, говорящий: «Ваша python команда не создала никакого выходного файла.»
  • Теперь она использует команду GNU grep, чтобы узнать идентификатор задания с помощью \K и regex и сохранить его в переменной с именем JOB_ID.
  • Далее идет если переменная NOT NULL, вы можете выполнить ваши дальнейшие команды там, где я упомянул, например, Run your further programs here......
  • В случае, если не найдено ИД задания, если значение переменной JOB_ID NOT NULL, скрипт завершит работу, говоря Looks like NO job id found, exiting from script now... bye!!
0 голосов
/ 19 февраля 2020

Вот простое решение, которое делает то, что вам нужно:

#!/bin/bash

cmd_output=$(python -m main --project_id <project_name> --topic_name <topic_name> --job_name <job_name>i) #captures the INFO output to a variable
id=$(grep -m 1 -o '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-[0-9]\{19\}' <<<  $cmd_output ) #extracts the job id from the variable

#now we can see if a valid id was generated 
if [[ -n $id ]]; then
  >&2 echo "$cmd_output" #you wanted to output both the INFO and id.  This outputs the INFO to stderr
  echo "$id" #this outputs the ID to stdout and can be captured as the result of your script
  #put next commands here
else
  #you can put an error message here if you want 
  exit 1 #non-zero exit indicates failure
fi

Дайте мне знать, если вам нужно что-нибудь еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...