从行中删除最后一个字符

Özz*_*esh 84 text-processing

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

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%
Run Code Online (Sandbox Code Playgroud)

预期结果:

Use
22
1
1
59
51
63
5
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 126

sed 's/.$//'
Run Code Online (Sandbox Code Playgroud)

删除最后一个字符。

但在这种特定情况下,您还可以执行以下操作:

df -P | awk 'NR > 1 {print $5+0}'
Run Code Online (Sandbox Code Playgroud)

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

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

df --output=pcent | tail -n +2 | tr -cd '0-9\n'
Run Code Online (Sandbox Code Playgroud)

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

在 Linux 上,另请参阅:

findmnt -no USE%
Run Code Online (Sandbox Code Playgroud)

  • `{print +$5}` 也可以工作... (10认同)
  • @jasonwryan,不幸的是,[有很多`awk` 实现不起作用](http://thread.gmane.org/gmane.comp.standards.posix.austin.general/11391),其中`+` 一元运算符只是被忽略,不会强制将字符串转换为数字。 (2认同)

Ber*_*ard 28

使用sed,这很容易:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5
Run Code Online (Sandbox Code Playgroud)

语法是s(ubstitute)/search/replacestring/. 在.表示任意字符,并且$所述线的端部。所以.$只会删除最后一个字符。

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

df -h | awk '{ print $5}' | sed 's/.$//'
Run Code Online (Sandbox Code Playgroud)

  • `sed` 的管道是多余的:它可以在 `awk` 中完成: `df -h | awk '{gsub(/%/,""); 打印 $5}'` (2认同)

小智 20

我有两个解决方案:

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

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

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

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


gle*_*man 10

在 awk 中,您可以执行以下操作之一

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
Run Code Online (Sandbox Code Playgroud)


Gus*_*uss 7

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

$ printf "I don't like periods." | head -c-1
I don't like periods
Run Code Online (Sandbox Code Playgroud)

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

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

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

some-command | while read line; do echo $(head -c-2 <<<"$line"); done
Run Code Online (Sandbox Code Playgroud)

  • 这将删除文件的最后一个字符,而不是每行的最后一个字符。 (2认同)