Hapus karakter terakhir dari baris


54

Saya ingin menghapus karakter terakhir dari sebuah baris:

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

Hasil yang diharapkan:

Use
22
1
1
59
51
63
5

2
Apakah itu selalu %pertanda?
Bernhard

Jawaban:


83
sed 's/.$//'

Untuk menghapus karakter terakhir.

Tetapi dalam kasus khusus ini, Anda juga bisa melakukan:

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

Dengan ekspresi aritmatika ( $5+0) kami memaksa awkuntuk menafsirkan bidang ke-5 sebagai angka, dan apa pun setelah angka tersebut akan diabaikan.

Perhatikan bahwa GNU df(Anda -hsudah merupakan ekstensi GNU, meskipun tidak diperlukan di sini) juga dapat diberitahu untuk hanya menampilkan persentase penggunaan disk:

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

(Ekor melewatkan header dan tr menghapus semuanya kecuali digit dan garis pembatas).

Di Linux, lihat juga:

findmnt -no USE%

9
{print +$5}akan bekerja juga ...
jasonwryan

1
@jasonwryan, sayangnya, ada banyak awkimplementasi di mana itu tidak berfungsi , di mana +operator unary diabaikan dan tidak memaksa konversi string ke numerik.
Stéphane Chazelas

20

Dengan sed, ini cukup mudah:

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

Sintaksnya adalah s(ubstitute)/search/replacestring/. The .menunjukkan karakter apapun, dan $pada akhir baris. Jadi .$akan menghapus karakter terakhir saja.

Dalam hal ini, perintah lengkap Anda akan terlihat:

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

2
Pipa ke sedredundan: dapat dilakukan di awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Maka saya lebih suka solusi Stephane.
Bernhard

15

Saya punya dua solusi:

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

    Di sini Anda membalikkan string dan memotong string dari karakter ke-2 dan membalikkannya lagi.

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

    Di sini Anda akan mencari ekspresi reguler .$yang berarti setiap karakter diikuti oleh karakter terakhir dan menggantinya dengan nol //(antara dua garis miring)


7

Dalam awk, Anda bisa melakukan salah satunya

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

2

pendekatan lain:

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

Ubah fungsi menjadi:

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

Kemudian panggil seperti ini:

remove_last '%' df -h

mapfile adalah fitur bash4.

Tangkapannya di sini adalah Anda harus menyediakan karakter untuk dihapus; jika Anda ingin hanya menjadi apa pun karakter terakhir terjadi maka Anda harus lulus '?'atau ''. diperlukan harga.



1

Coba dengan ini:

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

Penggunaan normal adalah: (yaitu)

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

Respons harus: X987654321X


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

Jawaban ini bisa lebih bermanfaat bagi orang lain di luar OP jika Anda bisa memberikan sedikit penjelasan tentang cara kerjanya dan mungkin mengapa ini mungkin lebih baik daripada alternatif
Fox

Selamat Datang di Unix Stackexchange! Anda dapat mengikuti tur untuk merasakan bagaimana situs ini bekerja. Saat memberikan jawaban, lebih baik memberi penjelasan mengapa MENGAPA jawaban Anda adalah yang diinginkan pembaca. Ini berarti yang terbaik adalah jika Anda memberikan penjelasan tentang cara kerjanya. Jika Anda melihat di atas, Anda akan melihat bahwa semua jawaban pilihan menjelaskan kode.
Stephen Rauch

Diperbaharui untuk penggunaan cut -d '%' -f1yang merupakan jawaban yang benar untuk mendapatkan semuanya sesuai dengan '%' pertama.
Titou

Ditambah lagi, saya percaya hanya jawaban yang berbahaya / salah yang akan diturunkan di bawah 0.
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

Opsional : Untuk menghapus baris pertama dan terakhir, gunakan sed -ie '1d;$d'nama file


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.