1
votes

Obtenir le chemin du processus en cours d'exécution, lorsque le chemin contient de l'espace

J'exécute NSTask dans une application macOS Cocoa avec la commande console pour déterminer le chemin d'un processus en cours d'exécution

Cependant, je rencontre des problèmes lors de l'analyse du chemin, s'il contient des espaces

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

si je veux utiliser awk , il est divisé sur l'espace blanc du chemin, ce qui n'est pas souhaité

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


1 commentaires

Essayez ps -e -o cmd | grep [F] MCore | awk '{print $ 1 "" $ 2}' . Eh bien, awk '{print $ 1 "" $ 2}' n'est pas une partie sûre: comment comptez-vous définir la fin du chemin? Essayez de remplacer la commande awk par sed 's / \ (FMCore [^ [: space:]] * \). * / \ 1 /' également.


3 Réponses :


1
votes

Pourriez-vous essayer de suivre.

awk '/FMCore/ && match($0,/\/.* /){val=substr($0,RSTART,RLENGTH); sub(/ +$/,"",val);print val}' Input_file

Avec awk

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


3 commentaires

cela imprime également l'e-standalone à la fin


@PeterLapisu, pas sûr mais votre échantillon montré ne l'a pas? Pourriez-vous s'il vous plaît élaborer plus sur celui-ci?


@PeterLapisu, btw ma solution awk supprimera également l'espace à la fin de la sortie.



1
votes

Il semble que vous ne vouliez qu'une partie de la colonne de commande, toute la ligne jusqu'au FMCore et l'espace suivant.

Vous pouvez directement obtenir la colonne cmd en utilisant ps -Ao commande (sous Linux, c'est ps -e -o cmd ), puis saisissez les lignes contenant FMCore avec grep [F] MCore , puis en supprimant tout après FMCore et tous les 0+ caractères non blancs le suivant avec

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}'

Le [F ] MCore est utilisé à la place de FMCore pour éviter de lister les détails de la commande grep .

Le 's / \ (FMCore La commande [^ [: space:]] * \). * / \ 1 / ' sed correspondra à FMCore + 0+ caractères non-blancs après il place la chaîne dans le groupe 1, et . * correspondra simplement au reste de la chaîne, et l'espace réservé \ 1 remettra le code FMCore > avec des espaces dans le résultat.

Il est également possible d'utiliser awk après avoir récupéré la chaîne cmd g pour saisir tous les champs jusqu'au premier ayant FMCore:

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


9 commentaires

ps: cmd: mot-clé introuvable: /


Eh bien, c'est probablement lié à la version ps , j'ai procps-ng version 3.3.10


J'utilise le dernier macOS 10.15 et j'ai lié la version de ps utilisée


@PeterLapisu Veuillez essayer de remplacer l'abréviation cmd par la commande complète. De plus, il semble que -a soit requis, pas -e dans BSD ps . Essayez ps -ao cmd ou ps -Ao command , au lieu de ps -e -o cmd , ou peut-être ps -Ao comm .


cela fonctionnera-t-il encore s'il y a plus d'espaces blancs?


@PeterLapisu Comme je l'ai mentionné dans mon commentaire à la question, nous devons savoir quelles sont les limites du chemin. Comment pouvez-vous décrire la fin du chemin que vous devez extraire?


@PeterLapisu Si vous avez besoin d'obtenir tout le premier champ commençant par - , vous pouvez utiliser la commande ps -Ao | awk '/ FMCore / {s = ""; pour (i = 1; i <= NF; i ++) if ($ i! ~ / ^ - /) {s = s $ i ""} else {break}; print s} '. Si le champ doit être de type - , utilisez / ^ - [[: alnum:] _] + $ / dans le code awk commande


@PeterLapisu, pourriez-vous s'il vous plaît me faire savoir si vous avez également essayé ma solution?


@PeterLapisu Heureux que cela ait finalement fonctionné selon vos besoins. Si vous avez besoin de plus de conseils, n'hésitez pas à laisser un commentaire.



0
votes

Permettez à awk de tester conditionnellement la présence du dernier champ ($ NF) pour voir s'il contient -standalone, et s'il est vrai, supprimez-le et affichez la chaîne de commande restante jusqu'à FMCore. Testé sur macOS Mojave 10.14.6 (18G103).

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


0 commentaires