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.