Bash 删除一条线的一部分?[猛击]

Bash 删除一条线的一部分?[猛击],bash,shell,sed,ps,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=zyot

我正在用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=zyote'最简单的方法是什么

PS:我不知道命令sed,所以如果使用,我将非常感谢您的详细解释


非常感谢对
剪切的输入需要重新格式化。使用

cat /proc/$1/cmdline | cut -d\  -f 1
注意,反斜杠后面有一个空格


顺便说一句,我看到你问了“去除'--type=zytoE'最简单的方法是什么?”这是一个不同的问题,你是在寻找一些类似于sed的东西吗?

输入到
cut
需要重新格式化。使用

cat /proc/$1/cmdline | cut -d\  -f 1
注意,反斜杠后面有一个空格

顺便说一句,我看到你问了“去除'--type=zygote'最简单的方法是什么?”这是一个不同的问题,你是在寻找一些类似sed的东西吗?

使用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将在'--'上对记录进行分隔。那么我只打印第1个字段

使用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
$ echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote" | sed "s/--type.*$//"
/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
使用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将在'--'上对记录进行分隔。那么我只打印第1个字段

使用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
$ echo "/opt/google/chrome/chrome-sandbox/opt/google/chrome/chrome--type=zygote" | sed "s/--type.*$//"
/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

这应该使用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
$ 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

这应该使用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
$ 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

如果您想完全删除您在帖子中所说的“--type=zygote”,您应该像这样使用
sed

cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--type=zygote//'
sed
的命令在单引号中指定
s
是替换命令,其格式为:
s/oldstuff/newstuff/
newstuff
替换
oldstuff
;如果
newstuff
为空行,则结果是
oldstuff
被删除(您可以用空行有效地替换
oldstuff
),这就是我们在示例中所做的

如果您想要更通用的操作,例如删除以
--
开头的行的其余部分,则应执行以下操作:

cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--.*//'
与前面示例的唯一区别是,我们使用正则表达式,其中
表示“任意符号”,并且
*
指定了前面符号的任意数量,因此
*
表示“任意数量的任意符号”,而
-.
表示“--后跟任意数量的任意符号”

sed
是一个非常强大的工具(也很有趣!),所以可能需要一些时间来阅读它


希望有帮助

如果您想完全删除您在帖子中所说的“--type=zygote”,您应该像这样使用
sed

cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--type=zygote//'
sed的命令在单引号中指定
s
是替换命令,其格式为:
s/oldstuff/newstuff/
newstuff
替换
oldstuff
;如果
newstuff
为空行,则结果是
oldstuff
被删除(您可以用空行有效地替换
oldstuff
),这就是我们在示例中所做的

如果您想要更通用的操作,例如删除以
--
开头的行的其余部分,则应执行以下操作:

cat /proc/$1/cmdline | cut -d " " -f 1 | sed 's/--.*//'
与前面示例的唯一区别是,我们使用正则表达式,其中
表示“任意符号”,并且
*
指定了前面符号的任意数量,因此
*
表示“任意数量的任意符号”,而
-.
表示“--后跟任意数量的任意符号”

sed
是一个非常强大的工具(也很有趣!),所以可能需要一些时间来阅读它


希望有帮助

/proc/*/cmdline
的命令和参数之间用null分隔。您可以使用
sed
删除第一个空值之后的所有内容:

sed 's/\x00.*//' < /proc/$1/cmdline
(我没有使用
cat
打印
cmdline
文件,因为这是不必要的进程激活;您可以使用重定向将文件中的信息获取到命令中。)

或者更好,对于纯Bash解决方案,使用带有nil分隔符的
read

IFS= read -r -d '' foo < /proc/$1/cmdline
printf '%s\n' "$foo"
IFS=read-r-d''foo

请注意,
/proc
并非到处都可用。(不过,我不知道如何获取命令行信息。)

/proc/*/cmdline
的命令和参数之间用null分隔。您可以使用
sed
删除第一个空值之后的所有内容:

sed 's/\x00.*//' < /proc/$1/cmdline
(我没有使用
cat
打印
cmdline
文件,因为这是不必要的进程激活;您可以使用重定向将文件中的信息获取到命令中。)

或者更好,对于纯Bash解决方案,使用带有nil分隔符的
read

IFS= read -r -d '' foo < /proc/$1/cmdline
printf '%s\n' "$foo"
IFS=read-r-d''foo

请注意,
/proc
并非到处都可用。(我不知道如何获取其他命令行信息。)

对于贡献+1:)对于贡献+1:)对于贡献+1:)对于清晰解释+1对于清晰解释+1,我认为IFS设置是多余的?我认为IFS设置是多余的?请注意,虽然这是“删除'--type=zygote''的最简单方法,它不是最干净、最正确的方法。尤其要注意其中包含'--'的路径或命令名或标志。此问题中的文本解析容易不安全或出错。请注意,虽然这是“删除'--type=zygote'的最简单方法”“,这不是最干净、最正确的方法。尤其要注意路径或命令名或标志中是否包含“---”。这个问题中的文本解析容易受到不安全或错误的影响。