Удалить последний символ из строки

54

Я хочу удалить последний символ из строки:

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

Ожидаемый результат:

Use
22
1
1
59
51
63
5
Özzesh
источник
2
Это всегда %знак?
Бернхард

Ответы:

83
sed 's/.$//'

Удалить последний символ.

Но в этом конкретном случае вы также можете сделать:

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

С помощью арифметического выражения ( $5+0) мы заставляем awk5-е поле интерпретировать как число, и все, что находится после числа, будет игнорироваться.

Обратите внимание, что GNU df(ваше -hрасширение уже является GNU, хотя здесь и не нужно) также можно указать вывод только процента использования диска:

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

(tail пропускает заголовки, а tr удаляет все, кроме цифр и разделителей строк).

В Linux смотрите также:

findmnt -no USE%
Стефан Шазелас
источник
9
{print +$5}будет работать так же ...
Джейсонвриан
1
@jasonwryan, к сожалению, есть много awkреализаций, где это не работает , где +унарный оператор просто игнорируется и не вызывает преобразования строк в числовые.
Стефан Шазелас,
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избыточна: это может быть сделано в awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan
@jasonwryan Тогда мне больше нравится решение Стефана.
Бернхард
15

У меня есть два решения:

  1. порез: echo "somestring1" | rev | cut -c 2- | rev

    Здесь вы переворачиваете строку и обрезаете строку из второго символа и снова переворачиваете.

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

    Здесь вы будете искать регулярное выражение, .$которое означает любые символы, за которыми следует последний символ, и заменять его на ноль //(между двумя слешами).

Гуру
источник
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

Chuss
источник
1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
user223910
источник
Этот ответ мог бы быть более полезным для других, кроме OP, если бы вы могли дать небольшое объяснение относительно того, как это работает и, возможно, почему это может быть лучше, чем альтернативы
Fox
Добро пожаловать в Unix Stackexchange! Вы можете взять тур, чтобы понять, как работает этот сайт. Когда вы даете ответ, предпочтительно дать какое-то объяснение, ПОЧЕМУ ваш ответ тот, который хочет читатель. Это означает, что будет лучше, если вы дадите некоторое объяснение того, как это работает. Если вы посмотрите выше, вы увидите, что все ответы с высоким рейтингом объясняют код.
Стивен Раух
Голосование за использование cut -d '%' -f1которого является правильным ответом, чтобы получить все в строке до первого «%».
Титу,
Кроме того, я считаю, что только вредные / неправильные ответы должны быть оценены ниже 0.
Титу,
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

Необязательно : для удаления 1-й и последней строки используйте sed -ie '1d;$d'имя файла

судхир татараджу
источник