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


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
Это всегда %знак?
Бернхард

Ответы:


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

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



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, если бы вы могли дать небольшое объяснение относительно того, как это работает и, возможно, почему это может быть лучше, чем альтернативы
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'имя файла


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.