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
Özzesh
sumber
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%
Stéphane Chazelas
sumber
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/.$//'
Bernhard
sumber
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)

Guru
sumber
7

Dalam awk, Anda bisa melakukan salah satunya

awk '{sub(/%$/,"",$5); print $5}'
awk '{print substr($5, 1, length($5)-1)}'
glenn jackman
sumber
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.

Josh McGee
sumber
1
$ df -h | awk '{print $5}' | cut -d '%' -f1 
ashok
sumber
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

Chuss
sumber
1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1
pengguna223910
sumber
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

sudhir tataraju
sumber
0
echo "123" | perl -ple 'chop'
12
bsb
sumber