获取 运行 进程的路径,当路径包含 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}'
我 运行 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
之后的所有字符和后面跟着
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}'