获取 运行 进程的路径,当路径包含 space

Get path of running process, when path contains space

我 运行 NSTask 在 macOS cocoa 应用程序中使用控制台命令来确定 运行 进程的路径

但是,我 运行 在解析路径时遇到问题,如果它包含空格

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 }'
/Applications/Suitcase
grep

如何仅获取路径,在本例中为

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

能否请您尝试以下。

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

awk

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

您似乎只想要命令列的一部分,即 FMCore 和下一个 space.

之前的所有行

你可以直接使用ps -Ao command获取cmd列(在Linux中是ps -e -o cmd),然后用[=16=抓取包含FMCore的行],然后删除 FMCore 之后的所有字符和后面跟着

的任何 0+ 个非白色 space 字符
ps -Ao command | grep [F]MCore | sed 's/\(FMCore[^[:space:]]*\).*//'

使用 [F]MCore 代替 FMCore 以避免列出 grep 命令详细信息。

's/\(FMCore[^[:space:]]*\).*//' sed 命令将匹配 FMCore + 任何 0+ 个非白色 spaces 字符后将字符串放入第 1 组,并且 .* 将只匹配字符串的其余部分,而 </code> 占位符会将带有白色 space 的 <code>FMCore 放回结果中。

也可以在获取 cmd 字符串后使用 awk 来获取所有字段,直到第一个具有 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}'

允许 awk 有条件地测试最后一个字段 ($NF) 是否存在,以查看它是否包含 -standalone,如果为真,则将其删除,并将剩余的命令字符串打印到 FMCore。在 macOS Mojave 10.14.6 (18G103) 上测试。

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