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
3 Réponses :
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
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.
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/'
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.
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}'
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 parsed 's / \ (FMCore [^ [: space:]] * \). * / \ 1 /'
également.