删除部分线? [庆典]

时间:2014-11-21 23:04:56

标签: bash shell sed ps

我正在用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,所以如果使用,我会非常感谢详细解释

非常感谢

5 个答案:

答案 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将空值重新格式化为空格,然后使用cutsedawk

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无处不在。 (不过,我不知道如何获取命令行信息。)