Вывести цифры из строки результата

Языки программирования, IDE, компиляторы, интерпретаторы, гипервизоры и виртуальные среды
Правила форума
Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Версия ОС вместе с разрядностью. Пример: LM 18.1 x64, LM Sarah x32 2. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 3. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 4. Суть. Желательно с выводом консоли, логами. 5. Скрин. Просьба указывать 1, 2 и 3 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
madesta
Сообщения: 593
Зарегистрирован: 11 июн 2017, 18:47
Решено: 7
Благодарил (а): 32 раза
Поблагодарили: 98 раз

Вывести цифры из строки результата

Сообщение madesta » 11 май 2020, 12:55

Имеется задание task.sh, состоящее из нескольких последовательно запускаемых task1.sh, task2.sh ...
После каждого задания задаётся вопрос: продолжать или снять выполнение задания:
task1.png
Листинг задачи ask.sh (задаётся вопрос):
#!/bin/bash
zenity --question --timeout=5 --title="Confirm" --text="Отменить задачу?"
answer=$?
if [ "$answer" -eq 0 ]; then
echo '1' > /home/minter/Tools/result.txt
elif [ "$answer" -eq 1 ]; then
echo '0' > /home/minter/Tools/result.txt
elif [ "$answer" -eq 5 ]; then
echo '0' > /home/minter/Tools/result.txt
fi
exit 0

Если введено No, то записывается 0, если Yes - 1. По умолчанию после 5 секундного ожидания записывается значение 0.

В задании test.sh имеется инструкция "если, то". Считывается значение выбора пользователя. Если оно равно 0, то ничего не делается (задание test.sh продолжается далее). Если считанное значение выбора пользователя 1, то должна выдаваться команда на прекращение процесса test.sh по его pid

Листинг:
#!/bin/bash
/home/minter/Tools/task1.sh
sleep 5
/home/minter/Tools/ask.sh
var=`cat /home/minter/Tools/result.txt`
if [ $var -eq 0 ];
then
:
else
kill -TERM pid_test.sh
fi
/home/minter/Tools/task2.sh
...

По запросу находятся 2 pid процесса test.sh

ps ax | grep -v grep | grep test.sh > /home/minter/Tools/test1.txt
task2.png
Чтобы отменить оба процесса достаточно завершить процесс test.sh с бОльшим значение pid
15166 ? S 0:00 /bin/sh -c sh '/home/minter/Tools/test.sh'
15167 ? S 0:00 sh /home/minter/Tools/test.sh

А бывает, что pid имеет значение до 10000

2164 ? S 0:00 /bin/sh -c sh '/home/minter/Tools/test.sh'
2165 ? S 0:00 sh /home/minter/Tools/test.sh

Поэтому из результата беру вторую строку и записываю в новый файл:

sed -n -e 2p /home/minter/Tools/test1.txt > /home/minter/Tools/test2.txt

И здесь затык. Необходимо выбрать из строки только цифры, которые и будут являться необходимым номером pid, чтобы записать их в переменную $varpid и дать команду kill -TERM $varpid Может быть кто подскажет решение, если это значение может быть и 5-значным, и 4-значным, например:
15167 ? S 0:00 sh /home/minter/Tools/test.sh

или

2165 ? S 0:00 sh /home/minter/Tools/test.sh

Решение rogoznik » 11 май 2020, 13:01
madesta, как то так

Код: Выделить всё

echo 2165 ? S 0:00 sh /home/minter/Tools/test.sh | awk '{print $1}'
на выходе получишь 2165

Перейти к ответу ➙
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя

rogoznik
Сообщения: 7529
Зарегистрирован: 27 июн 2017, 10:36
Решено: 84
Откуда: Нижний Тагил
Благодарил (а): 419 раз
Поблагодарили: 1337 раз

Вывести цифры из строки результата

Сообщение rogoznik » 11 май 2020, 13:01

madesta, как то так

Код: Выделить всё

echo 2165 ? S 0:00 sh /home/minter/Tools/test.sh | awk '{print $1}'
на выходе получишь 2165
ИзображениеИзображение

Аватара пользователя

Автор темы
madesta
Сообщения: 593
Зарегистрирован: 11 июн 2017, 18:47
Решено: 7
Благодарил (а): 32 раза
Поблагодарили: 98 раз

Вывести цифры из строки результата

Сообщение madesta » 11 май 2020, 13:11

Примечание. Только пришлось сначала прочитать строку:

var=`cat /home/minter/Tools/test2.txt`
echo $var | awk '{print $1}' > /home/minter/Tools/test3.txt

Вернуться в «Программирование, скриптинг, виртуализация»