从行中删除最后一个字符


54

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

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

预期结果:

Use
22
1
1
59
51
63
5

2
它总是一个%标志吗?
伯恩哈德

Answers:


83
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%

9
{print +$5}也会正常工作
jasonwryan

1
不幸的是,@ jasonwryan 有很多awk实现方式不起作用+一元运算符只是被忽略并且不会强制将字符串转换为数值。
斯特凡Chazelas

20

使用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/.$//'

2
到的管道sed是多余的:可以在以下位置进行awkdf -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan然后,我更喜欢Stephane的解决方案。
伯恩哈德

15

我有两种解决方案:

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

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

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

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


7

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

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'

2

另一种方法:

mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"

把它变成一个函数:

remove_last() {
  local char=${1:-?}; shift
  mapfile -t list < <("$@")
  printf '%s\n' "${list[@]%$char}"
}

然后这样称呼它:

remove_last '%' df -h

mapfile 是bash4的功能。

这里的要点是您必须提供要删除的字符;如果您希望它成为最后一个字符,则必须通过'?'''。引号为必填项。



1

试试这个:

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

正常使用是:

VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"

响应应为:X987654321X


1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1

如果您可以对OP的工作原理以及可能为何比其他方法更好的情况提供一些解释,则此答案可能会对OP以外的其他人员更有用
Fox

欢迎使用Unix Stackexchange!您可以浏览此站点,以了解该站点的工作方式。在给出答案时,最好给出一些解释,为什么您的答案是读者想要的。这意味着最好对它的工作方式进行一些解释。如果您在上面看,您将看到所有获得高度评价的答案都对代码进行了解释。
Stephen Rauch

赞成使用cut -d '%' -f1该方法是正确的答案,可以使该行中的所有内容都达到第一个'%'。
Titou

另外,我相信只有有害/错误的答案才应该被
贬低

0
sed -ie '$d' filename

here -i is to write changes
      e means expression
      $ means last line
      d means delete

Note:Without -e option $ wont work

可选:要删除第一行和最后一行,请使用sed -ie '1d;$d'文件名


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.