我想从一行中删除最后一个字符:
[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
5Run 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)
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)
小智 20
我有两个解决方案:
切: echo "somestring1" | rev | cut -c 2- | rev
在这里,您反转字符串并从第二个字符剪切字符串并再次反转。
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)
您知道这一点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)