Наконец-то я нашел способ заставить эхо ввести пароль (единственная проблема заключалась в том, что у меня не было клавиатуры).
#!/bin/bash
echo -e "password\n" | sudo -S command --flag argument
-e
разрешает экранирование обратной косой черты, а sudo -S
включает ввод STD (таким образом, ввод из эха конвейерно). Согласно руководству, входы -S
должны заканчиваться escape-символом \ n
Трудно сказать, почему ваш скрипт ведет себя плохо, так как мы не знаем, как выглядят файлы, с которыми вы имеете дело. Все, что мы знаем, это то, что вас интересуют строки, содержащие строку ID
, и что вы хотели бы получить все, что находится после =
в этих строках.
Ваш сценарий содержит две неиспользуемые переменные:count
(строку, содержащую команду оболочки )иpid
(пустую переменную ). Вы также прыгаете через множество обручей, чтобы добраться до того, что после=
:
more "$line" | grep ID | awk -F '=' '{ print $2 }'
Команда more
является пейджером, т. е. утилитой для просмотра файлов. Вместо этого вы можете разрешить grep
читать файл напрямую:
grep ID "$line" | awk -F '=' '{ print $2 }'
Но это просто позволяет grep
делать то, что awk
может сделать само по себе,
awk -F '=' '/ID/ { print $2 }' "$line"
Но мы можем добиться большего. Вместо сохранения всех путей в файл $filename
, мы можем позволить find
сделать всю работу за нас:
find /opt/Logs -type f -size +10k \
-exec awk -F '=' '/ID/ { print $2 }' {} + >pid.txt
При этом будут найдены все обычные файлы размером не ниже /opt/Logs
размером более 10 КБ. Для каждого такого файла после (будут напечатаны первые)=
в каждой строке, содержащей строку ID
. Результат этого будет сохранен в pid.txt
.
Связанные:
filename='bigfiles' find /opt/Logs -type f -size +10k > $filename
for line in $(cat bigfiles)
do
echo "$line"
pid= grep JOBID "$line" | awk -F '=' '{print $2}' >> pid.txt
kill $(more $line | grep JOBID | awk -F '=' '{print $2}')
bhist -l $(grep JOBID "$line" | awk -F '=' '{print $2}') >> hist.txt;
done