我正在用bash编写自己的ps命令,但是我在获取cmdline时遇到了一些麻烦。这是我的代码:
get_cmdline(){
if [ -f "/proc/$1/cmdline" ]; then
cat /proc/$1/cmdline | cut -d " " -f 1
else echo n/a
fi
}
但这就是我得到的:
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote
删除'--type = zygote'的最简单方法是什么?
PS:我不知道命令sed,所以如果使用,我会非常感谢详细解释
非常感谢
答案 0 :(得分:2)
使用awk:
echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote" | awk -F "--" '{print $1}'
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome
awk会在' - '上划分记录。然后我打印第一场仅一场
使用sed:
echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote" | sed 's/--.*//g'
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome
使用模式匹配:
a="/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote"
echo ${a%--*}
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome
答案 1 :(得分:1)
cut
的输入需要重新格式化。使用
cat /proc/$1/cmdline | cut -d\ -f 1
请注意,反斜杠之后还有一个空格。
BTW我看到你问过"最简单的方法是删除' - type = zygote'?"这是一个不同的问题,你在寻找一些sed
- 喜欢的东西吗?
答案 2 :(得分:1)
应该使用sed:
$ echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote" | sed "s/--type.*$//"
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome
如果你想使用cut,那么:
$ echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type" | rev | cut -d'-' -f3- | rev
/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome
答案 3 :(得分:1)
如果您想要删除帖子中所说的'--type = zygote',则应使用sed
,如下所示:
cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--type=zygote//'
sed
的命令在单引号中指定。 s
是替换命令,其格式为:s/oldstuff/newstuff/
以oldstuff
替换newstuff
;如果newstuff
为空行,则结果为oldstuff
被删除(您有效地将oldstuff
替换为空行),这就是我们在示例中所做的。
如果您想要更多的普遍行动,例如删除以--
开头的其余行,你应该这样做:
cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--.*//'
与上一个示例的唯一区别在于我们使用正则表达式,.
代表“任何符号”,*
指定任意数量的前一个符号,因此.*
表示“任意数量的任何符号”和--.*
表示“ - 后跟任意数量的任何符号”。
sed
是非常强大的工具(也很有趣!)所以可能需要一些时间来阅读它。
希望有所帮助!
答案 4 :(得分:0)
/proc/*/cmdline
的命令和参数由空值分隔。您可以使用sed
删除第一个空后的所有内容:
sed 's/\x00.*//' < /proc/$1/cmdline
或者您可以使用xargs
将空值重新格式化为空格,然后使用cut
或sed
或awk
:
xargs -0 echo < /proc/$1/cmdline | cut -d" " -f1
xargs -0 echo < /proc/$1/cmdline | sed 's/ .*//'
xargs -0 echo < /proc/$1/cmdline | awk '{print $1}'
(我没有使用cat
来打印cmdline
文件,因为这是不必要的进程激活;您可以使用重定向将文件中的信息输入到命令中。)
甚至更好,对于纯Bash解决方案,使用read
和nil分隔符:
IFS= read -r -d '' foo < /proc/$1/cmdline
printf '%s\n' "$foo"
请注意,/proc
无处不在。 (不过,我不知道如何获取命令行信息。)