Как объединить два скрипта в Linux, используя один из выходных во втором - PullRequest
1 голос
/ 02 апреля 2020

Я полный сценарий написания noob в Linux. Я должен работать на QNAP NAS. Проблема в том, что иногда файлы остаются открытыми. Я должен проверить, кто открыл файл. Сначала мне нужно получить список открытых файлов. Каждый открытый файл имеет связанный PID. Затем я должен получить имена пользователей домена по PID.

У меня есть два сценария. Первый перечисляет PID открытых файлов. Я передаю один параметр, имя файла, который я ищу. Он может генерировать больше строк с PID.

Второй сценарий перечисляет имя пользователя в связанном домене для данного PID. Мне нужно запустить второй скрипт для каждого PID, указанного в первом скрипте.

Я не знаю, как обрабатывать во втором скрипте многострочный вывод из скрипта frist.

Спасибо для совета.

Пометить

первый скрипт (smbopenfiles):

/usr/local/samba/bin/smbstatus -v|grep $1|awk '{print $1}'

второй скрипт (smbwhois):

/usr/local/samba/bin/smbstatus -v|grep $1|awk '{print $3}'|grep -v -e DENY|grep -v -e domain

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Я делаю пару предположений на основе ваших сценариев:

1.) grep $1 предназначен для идентификации / изоляции первого столбца выходных данных. Я думаю, что это, возможно, неправильное понимание того, как работает grep с вашей стороны, так как часть awk '{print $1}' в конце конвейера должна делать то, что вы хотите в этом случае.

2.) Поскольку переключатель -v чтобы grep возвращает строки, которые не соответствуют указанному шаблону, во втором сценарии вы намереваетесь отобразить все строки, которые не содержат «DENY» или «домен» в третьем столбце.

Если эти предположения верны, вы можете сделать все это в одной строке с помощью awk:

smbstatus -v | awk '($1 ~ /[0-9]+/) && ($3 !~ /DENY/) && ($3 !~ /domain/) {print $1"\t"$2"\t"$3}'

Это должно привести к тому, что awk даст вам только те строки, где первый столбец - это число (предположительно, ваш PID), и третий столбец не содержит DENY или домен. Столбцы 1, 2 и 3 из строк, соответствующих этим критериям, написаны разделенными табуляцией.

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

pids=`smbstatus -v | awk '($1 ~ /[0-9]+/) {print $1}'`
for pid in $pids
do
     echo $pid
done

Вы бы заменили echo $pid на команду come, которая использует каждый Пид мы нашли.

0 голосов
/ 03 апреля 2020

Это последний сценарий.

if [ "$1" = "" ] || [ "$1" = "-?" ]; then
        echo Enter file or folder name to search for...
else
        pids=`/usr/local/samba/bin/smbstatus -v|grep $1 |grep DENY_WRITE|awk '($1 ~ /[0-9]+/) {print $1}'`
        oldid=0
        for pid in $pids
        do
                if [ $oldid != $pid ]; then
                        echo $pid
                        /usr/local/samba/bin/smbstatus -v|grep $pid|awk '{print $3}'|grep -v -e DENY|grep -v -e domain|tail -n 1
                        /usr/local/samba/bin/smbstatus -v|grep $pid|grep DENY_WRITE
                        echo
                        oldid=$pid
                fi
        done
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...