Поиск точного совпадения в QNX без использования grep -w

Я пишу скрипт, который должен найти точное совпадение в файле, совместимом с QNX и POSIX-совместимым Linux.

Подробнее:

Я пытаюсь найти пользователя процесса, поэтому исходная команда, которую я написал, была

user=$(ps -aux | awk '{print $1 " " $2}' | grep -w ${process} | awk '{}print $1')

который отлично работает в POSIX-совместимом Linux

однако QNX не полностью совместим с POSIX, а grep -w не подходит для моей цели... поэтому мне нужно найти точное совпадение без grep -w


person Anthony Calandra    schedule 25.07.2017    source источник
comment
Я считаю, что один вызов awk может сделать все, что вы надеетесь достичь с помощью awk ... | grep ... | awk ..., который почти всегда является плохой структурой. Пожалуйста, покажите образец вывода вашего ps и объясните, какие части должны соответствовать каким. Также рассмотрите возможность замены одного, если ваши 3 тега qnx на awk.   -  person Mark Setchell    schedule 26.07.2017
comment
поэтому моя цель - заставить пользователя процесса получить идентификатор процесса, поэтому мне нужно удалить все значения мусора из команды ps -aux, для чего предназначен первый awk (я awk только для идентификатора и имени пользователя и удалить все остальные числа, которые могут испортить следующий grep -w) Затем я grep -w идентификатор (мне нужны точные данные, потому что у вас может быть идентификатор 11 и 1112, который регулярный grep вытянет оба), затем я вывожу только имя пользователя, которое сохраняется в переменную... также спасибо за подсказку по тегам   -  person Anthony Calandra    schedule 26.07.2017
comment
Да, используйте один awk с разделителями слов, например awk '/\<PROCESSID\>/ {do something}'   -  person Mark Setchell    schedule 26.07.2017
comment
@MarkSetchell - символы границы слов \< и \> работают только в GNU awk (gawk), который, я сомневаюсь, доступен в QNX, если GNU grep недоступен, но вы можете сделать ps -aux |awk '$2=="'$process'"{print $1}'   -  person Adam Katz    schedule 31.07.2017
comment
Кроме того, я почти уверен, что вы можете просто сделать ps u $process |awk 'NR>1{print $1}', но я не знаю опций QNX ps.   -  person Adam Katz    schedule 31.07.2017


Ответы (2)


Я думаю, вы хотите напечатать поле 1, если поле 2 точно соответствует чему-то:

ps -aux | awk -v p=$process '$2==p{print $1}'
person Mark Setchell    schedule 26.07.2017

-w не является допустимым параметром POSIX для grep, его не следует использовать для приложения, которое должно быть переносимым между системами POSIX. Всегда можно просто ps -p $1 -o user= ? Что вы собираетесь делать с grep и awk в случаях, когда пользователь может совпадать с идентификатором процесса?

person v836    schedule 26.07.2017
comment
Спасибо, я честно предположил, что -w был posix, так как это был grep ... также я планирую не иметь пользователей, которые представляют собой строку чисел, таких как идентификатор, поэтому я игнорирую возможность этого... но я просто добавлю предупреждение, которое появится в случае возникновения ситуации (это используется только инженерами, чтобы они могли справиться с крайним случаем, если это произойдет) - person Anthony Calandra; 26.07.2017