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

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

Автор темы
madesta
Сообщения: 2011
Зарегистрирован: 11 июн 2017, 21:47
Решено: 29
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 430 раз
Контактная информация:

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

#1

11 май 2020, 15:55

Имеется задание task.sh, состоящее из нескольких последовательно запускаемых task1.sh, task2.sh ...
После каждого задания задаётся вопрос: продолжать или снять выполнение задания:
task1.png
task1.png (6.56 КБ) 536 просмотров
Листинг задачи 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, 16:01
madesta, как то так

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

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

Перейти к ответу ➙

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

rogoznik
Сообщения: 10040
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1956 раз
Контактная информация:

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

#2

11 май 2020, 16:01

madesta, как то так

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

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

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

Автор темы
madesta
Сообщения: 2011
Зарегистрирован: 11 июн 2017, 21:47
Решено: 29
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 430 раз
Контактная информация:

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

#3

11 май 2020, 16:11

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

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

Закрыто

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость