Satırdaki son karakteri kaldır


54

Satırdaki son karakteri kaldırmak istiyorum:

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

Beklenen Sonuç:

Use
22
1
1
59
51
63
5

2
Her zaman bir %işaret mi?
— Bernhard

Yanıtlar:


83
sed 's/.$//'

Son karakteri kaldırmak için.

Ancak bu özel durumda, şunları da yapabilirsiniz:

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

Aritmetik ifade ( $5+0) awkile 5. alanı sayı olarak yorumlamaya zorlarız ve sayıdan sonraki herhangi bir şey göz ardı edilir.

GNU’ya df( -hburada zaten ihtiyaç duyulmasa da, zaten bir GNU uzantısıdır) disk kullanım yüzdesinin yalnızca çıktısı verilebileceğini unutmayın:

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

(kuyruk başlıkları atlar ve tr, rakamlardan ve satır sınırlayıcılardan başka her şeyi kaldırır).

Linux'ta ayrıca bakınız:

findmnt -no USE%

9
{print +$5}aynı zamanda çalışacak ...
— jasonwryan

1
@jasonwryan maalesef bir sürü awkbu işe yaramazsa uygulamalarda , +tekli operatör sadece göz ardı edilir ve sayısal için dizeleri dönüşümünü zorlamaz.
— Stéphane Chazelas 11:15

20

İle sed, bu oldukça kolaydır:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

Sözdizimi s(ubstitute)/search/replacestring/. .Herhangi bir karakter ve işaret $çizgisinin sonunu. Yani .$sadece son karakteri kaldıracak.

Bu durumda, komutun tamamı şöyle görünür:

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

2
Boru sedfazlalık: içinde yapılabilir awk:df -h | awk '{gsub(/%/,""); print $5}'
— jasonwryan

@ jasonwryan O zaman Stephane'in çözümünü daha çok seviyorum.
— Bernhard,

15

İki çözümüm var:

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

    Burada dizgiyi ters çevirir ve dizgiyi 2. karakterden keser ve tekrar tersine çevirirsiniz.

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

    Burada düzenli ifade arayacaktır .$bir son karakteri tarafından takip herhangi bir karakter anlamına gelir ve boş ile değiştirin //(iki eğik çizgiler arasında)


7

Awk'ta, birini yapabilirsin

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

2

başka bir yaklaşım:

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

Bir işleve dönüştürün:

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

O zaman şöyle söyle:

remove_last '%' df -h

mapfile bir bash4 özelliğidir.

Buradaki mandal , kaldırmak için bir karakter sağlamanız gerektiğidir ; Son karakterin ne olduğu gibi olsun istiyorsan, geçmelisin '?'veya ''. tırnak gerekli.



1

Şunu dene:

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

Normal kullanım: (yani)

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

Yanıt şu olmalıdır: X987654321X


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

Nasıl çalıştığı ve bunun neden alternatiflerden daha iyi olabileceği konusunda biraz açıklamada bulunabilseydiniz, bu cevap OP dışındaki diğerleri için daha yararlı olabilir
— Fox

Unix Stackexchange'e Hoş Geldiniz! Sen edebilirsiniz tura bu site nasıl çalıştığını bir fikir edinmesini. Bir cevap verirken, cevabın neden okuyucunun istediği olduğu konusunda bir açıklama yapmak tercih edilir . Bunun nasıl çalıştığı hakkında bir açıklama yaparsanız en iyisidir. Yukarıya bakarsanız, yüksek oy kullanan cevapların hepsinin kodu açıkladığını göreceksiniz.
— Stephen Rauch

İlk satırdaki cut -d '%' -f1her şeyi elde etmek için doğru cevap hangisidir ?
— Titou

Artı, yalnızca zararlı / yanlış cevapların 0'dan aşağıya düşürülmesi gerektiğine inanıyorum.
— 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

İsteğe bağlı : 1. ve son satırları silmek için sed -ie '1d;$d'dosya adı kullanın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.