Xóa ký tự cuối cùng khỏi dòng


54

Tôi muốn xóa ký tự cuối cùng khỏi một dòng:

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

Kết quả dự kiến:

Use
22
1
1
59
51
63
5

2
Nó luôn luôn là một %dấu hiệu?
Bernhard

Câu trả lời:


83
sed 's/.$//'

Để loại bỏ ký tự cuối cùng.

Nhưng trong trường hợp cụ thể này, bạn cũng có thể làm:

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

Với biểu thức số học ( $5+0), chúng tôi buộc awkphải diễn giải trường thứ 5 dưới dạng số và mọi thứ sau số sẽ bị bỏ qua.

Lưu ý rằng GNU df(của bạn -hđã là một phần mở rộng GNU, mặc dù không cần thiết ở đây) cũng có thể được yêu cầu chỉ xuất phần trăm sử dụng đĩa:

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

(đuôi bỏ qua các tiêu đề và tr loại bỏ mọi thứ trừ các chữ số và dấu phân cách dòng).

Trên Linux, xem thêm:

findmnt -no USE%

9
{print +$5}cũng sẽ hoạt động tốt ...
jasonwryan

1
@jasonwryan, thật không may, có rất nhiều awktriển khai trong đó không hoạt động , trong đó +toán tử đơn nguyên chỉ bị bỏ qua và không buộc chuyển đổi chuỗi thành số.
Stéphane Chazelas

20

Với sed, điều này là khá dễ dàng:

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

Cú pháp là s(ubstitute)/search/replacestring/. Dấu .hiệu cho biết bất kỳ ký tự nào và $cuối dòng. Vì vậy, .$sẽ loại bỏ các ký tự cuối cùng mà thôi.

Trong trường hợp này, lệnh hoàn chỉnh của bạn sẽ trông:

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

2
Đường ống đến sedlà dư thừa: nó có thể được thực hiện trong awk:df -h | awk '{gsub(/%/,""); print $5}'
jasonwryan

@jasonwryan Sau đó, tôi thích giải pháp của Stephane hơn.
Bernhard

15

Tôi có hai giải pháp:

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

    Tại đây bạn đảo ngược chuỗi và cắt chuỗi từ ký tự thứ 2 và đảo ngược lại.

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

    Tại đây, bạn sẽ tìm kiếm biểu thức chính quy .$có nghĩa là bất kỳ ký tự nào được theo sau bởi một ký tự cuối cùng và thay thế nó bằng null //(giữa hai dấu gạch chéo)


7

Trong awk, bạn có thể làm một trong

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

2

Cách tiếp cận khác:

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

Biến nó thành một chức năng:

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

Sau đó gọi nó như thế này:

remove_last '%' df -h

mapfile là một tính năng bash4.

Điều hấp dẫn ở đây là bạn phải cung cấp một ký tự để loại bỏ; nếu bạn muốn nó chỉ là bất cứ điều gì mà nhân vật cuối cùng xảy ra thì bạn phải vượt qua '?'hoặc ''. yêu cầu báo giá.



1

Hãy thử với điều này:

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

Việc sử dụng bình thường là: (tức là)

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

Phản hồi phải là: X987654321X


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

Câu trả lời này có thể hữu ích hơn cho những người khác ngoài OP nếu bạn có thể cung cấp một chút giải thích về cách thức hoạt động của nó và có thể tại sao điều này có thể tốt hơn các lựa chọn thay thế
Fox

Chào mừng bạn đến với Unix Stackexchange! Bạn có thể thực hiện chuyến tham quan để cảm nhận về cách trang web này hoạt động. Khi đưa ra câu trả lời, tốt nhất là đưa ra một số lời giải thích về lý do TẠI SAO câu trả lời của bạncâu hỏi mà người đọc muốn. Điều này có nghĩa là tốt nhất nếu bạn đưa ra một số lời giải thích về cách thức hoạt động của nó. Nếu bạn nhìn ở trên, bạn sẽ thấy rằng tất cả các câu trả lời được bình chọn cao giải thích mã.
Stephen Rauch

Được nâng cấp cho việc sử dụng cut -d '%' -f1đó là câu trả lời chính xác để đưa mọi thứ trong dòng lên đến '%' đầu tiên.
Titou

Thêm vào đó, tôi tin rằng chỉ những câu trả lời có hại / sai mới bị hạ xuống dưới 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

Tùy chọn : Để xóa dòng thứ 1 và dòng cuối, sử dụng sed -ie '1d;$d'tên tệp


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.