Получить путь запущенного процесса, когда путь содержит пространство - PullRequest
1 голос
/ 28 октября 2019

Я запускаю NSTask в приложении macOS для какао с консольной командой для определения пути работающего процесса

Однако у меня возникают проблемы при разборе пути, если он содержит пробелы

ps -ax | grep FMCore
10880 ??         0:50.37 /Applications/Suitcase Fusion.app/Contents/Resources/FMCore -standalone
11420 ttys004    0:00.00 grep FMCore

, если я хочу использовать awk, он разделяется на пробелы пути, что нежелательно

ps -ax | grep FMCore | awk '{print $4}'
/Applications/Suitcase
grep

Как получить только путь, который в данном случае равен

/Applications/Suitcase Fusion.app/Contents/Resources/FMCore

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Похоже, вам нужна только часть столбца команды, вся строка до FMCore и следующий пробел.

Вы можете напрямую получить столбец cmd, используя ps -Ao command (в Linux, это ps -e -o cmd), затем захватывает строки, содержащие FMCore с grep [F]MCore, а затем удаляет все после FMCore и любые 0+ непробельных символов, следующих за ним с

ps -Ao command | grep [F]MCore | sed 's/\(FMCore[^[:space:]]*\).*/\1/'

. [F]MCore используется вместо FMCore, чтобы избежать вывода сведений о команде grep.

Команда 's/\(FMCore[^[:space:]]*\).*/\1/' sed будет соответствовать FMCore + любым 0+ непробельным символам после ее размещениястрока в группу 1, и .* будет просто соответствовать остальной части строки, а заполнитель \1 вернет FMCore с пробелами обратно в результат.

Также возможноиспользуйте awk после получения строки cmd, чтобы захватить все поля до первого, имеющего FMCore:

ps -Ao command | awk '/FMCore/{s=""; for (i=1;i<=NF;i++) if ($i !~ /FMCore/) {s=s $i" "} else {s=s $i; break}; print s}'
1 голос
/ 28 октября 2019

Не могли бы вы попробовать следующее.

sed '/FMCore/s/.*[0-9]+:[0-9]+:[0-9]+ \(.* \).*/\1/'  Input_file

С awk

awk '/FMCore/ && match($0,/\/.* /){val=substr($0,RSTART,RLENGTH); sub(/ +$/,"",val);print val}' Input_file
0 голосов
/ 03 ноября 2019

Разрешить awk условно проверять наличие последнего поля ($ NF), чтобы увидеть, содержит ли оно -standalone, и если true, удалить его и распечатать оставшуюся командную строку до FMCore. Протестировано на MacOS Mojave 10.14.6 (18G103).

ps -Ao command | awk '/FMCore/ {if ($NF == "-standalone")$NF="";print}'
...