Оболочка является совершенно подходящим инструментом для этого задания. Просто заботьтесь для не искажения пробелов и обратных косых черт.
while IFS= read -r line; do
if predicate "$line"; then printf '%s\n' "$line"; done
done
Вы могли также использовать awk. Обязательно заключите каждую строку в кавычки, так как она будет передана оболочке (отрывок ниже помещает одинарные кавычки вокруг строки и заменяет одинарные кавычки в строке '\''
; \047
'
). Поскольку каждый вызов команды проходит оболочку, я ожидаю, что это будет медленнее, чем чистый метод оболочки, даже если awk, вероятно, будет быстрее при парсинге строк. Но я не сделал сравнительных тестов.
awk '{quoted=$0; gsub(/\047/, "\047\\\\\047\047")}
!system("predicate \047" $0 "\047")'
Мое предположение - то, что VLC порождает дочерние процессы (как Apache, который сервер HTTP делает, например). Если это так, и если Ваша версия ps
поддержки это, можно попытаться работать ps -H
видеть процессы, перечисленные в древовидном расположении. Использовать -C vlc
ограничить вывод только vlc процессы.
$ ps -H -C apache2
PID TTY TIME CMD
1374 ? 00:00:00 apache2
1377 ? 00:00:00 apache2
1378 ? 00:00:00 apache2
1379 ? 00:00:00 apache2
С другой стороны, используйте ps -f
получить "полный" вывод, включая родительский PID (PPID). Снова, это проясняет, какой процесс является родительским процессом.
$ ps -f -C apache2
UID PID PPID C STIME TTY TIME CMD
root 1374 1 0 03:47 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1377 1374 0 03:47 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1378 1374 0 03:47 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1379 1374 0 03:47 ? 00:00:00 /usr/sbin/apache2 -k start