Я делаю пару предположений на основе ваших сценариев:
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, которая использует каждый Пид мы нашли.