![从行中删除最后一个字符](https://linux22.com/image/44995/%E4%BB%8E%E8%A1%8C%E4%B8%AD%E5%88%A0%E9%99%A4%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6.png)
我想从一行中删除最后一个字符:
[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
我有两个解决方案:
切:
echo "somestring1" | rev | cut -c 2- | rev
在这里,您反转字符串并从第二个字符剪切字符串,然后再次反转。
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