从行中删除最后一个字符

从行中删除最后一个字符

我想从一行中删除最后一个字符:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

预期结果:

Use
22
1
1
59
51
63
5

答案1

sed 's/.$//'

删除最后一个字符。

但在这种特定情况下,您也可以这样做:

df -P | awk 'NR > 1 {print $5+0}'

使用算术表达式 ( $5+0),我们强制awk将第 5 个字段解释为数字,数字后面的任何内容都将被忽略。

请注意,GNU df(您-h已经是 GNU 扩展,尽管这里不需要)也可以被告知仅输出磁盘使用百分比:

df --output=pcent | tail -n +2 | tr -cd '0-9\n'

(tail 跳过标题,tr 删除除数字和行分隔符之外的所有内容)。

在 Linux 上,另请参阅:

findmnt -no USE%

答案2

有了sed,这非常简单:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

语法是s(ubstitute)/search/replacestring/.表示.任意字符,表示$行尾。因此.$只会删除最后一个字符。

在这种情况下,您的完整命令将如下所示:

df -h | awk '{ print $5}' | sed 's/.$//'

答案3

我有两个解决方案:

  1. 切: echo "somestring1" | rev | cut -c 2- | rev

    在这里,您反转字符串并从第二个字符剪切字符串,然后再次反转。

  2. sed: echo "somestring1" | sed 's/.$//'

    在这里,您将搜索正则表达式.$,这意味着最后一个字符后面的任何字符并将其替换为 null //(两个斜杠之间)

答案4

您知道这一点head并且tail可以在字符基础上而不是在每行基础上工作吗?

$ printf "I don't like periods." | head -c-1
I don't like periods

(顺便说一句,printf此处使用 是为了防止在行末尾打印“换行”字符。如果您的输出有换行符并且您想要删除它以及最后一个非空白字符,请使用head -c-2)。

这与“Guru”使用 的解决方案基本相同cut,但没有他们需要使用的时髦rev来回,因为cut没有“最后 n 件事”的语法。

要迭代行流并删除每行的最后一个字符,可以执行如下操作:

some-command | while read line; do echo $(head -c-2 <<<"$line"); done

相关内容