Có cách nào để làm cho lệnh cắt chỉ đọc trường cuối cùng không?


10

Tôi có một chuỗi tách biệt không gian được xuất ra bởi một lệnh mà tôi muốn chuyển sang cutsử dụng -fd ' 'để phân chia trên các khoảng trắng. Tôi biết tôi có thể sử dụng -f <n>để hiển thị số trường <n>, nhưng tôi có thể làm cho nó hiển thị trường cuối cùng nếu tôi không biết độ dài của chuỗi không?

Hay tôi cần phải sử dụng một văn bản linh hoạt hơn chỉnh sửa công cụ như sedhay awk?


Tôi nghĩ lệnh cắt không thể hỗ trợ, nhưng không chắc chắn, bạn đã thử với cut -d '' -f- chưa?
αғsнιη

3
Nhiều cách khác để làm điều đó: stackoverflow.com/questions/22727107/ từ
edwinksl

@KasiyA -nlàm cho nó là n từ đầu, n-là từ n đến cuối, và có --complementtùy chọn đảo ngược lựa chọn. Nhưng không có cách nào để đếm số lượng các lĩnh vực và hành động theo nó như tôi có thể nói.
Arronical

Câu trả lời:


12

Không cutthể làm điều đó. Bạn có thể sử dụng hai revlệnh, như

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

nhưng nó thường dễ sử dụng hơn awk:

echo 'foo bar baz' | awk '{print $(NF)}'

7

Bạn có thể làm điều này bằng cách chỉ sử dụng shell, không cần công cụ bên ngoài, sử dụng Mở rộng tham số:

${var##* }

var##*sẽ loại bỏ mọi thứ từ bắt đầu đến không gian cuối cùng từ tham số (biến) var.

Nếu dấu phân cách có thể là bất kỳ khoảng trắng nào, ví dụ như khoảng trắng hoặc tab, hãy sử dụng lớp ký tự [:blank:]:

${var##*[[:blank:]]}

Thí dụ:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Tôi đã nói về việc sử dụng mở rộng tham số trong một nhận xét về câu trả lời của Severus Tux, nhưng lớp ký tự trống là thông tin hữu ích, cảm ơn.
Arronical

4

Cá nhân tôi thích câu trả lời của Florian Diesch. Nhưng có cách này quá.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Giải trình:

wc -wđưa ra số lượng từ. và cutcắt từ cuối cùng

BIÊN TẬP:

Tôi đã tìm ra một cách khác để làm điều đó:

echo "Any random string here" | tac -s' ' | head -1

Đúng, nhưng điều này đúng khi delim là dấu cách hoặc tab và nếu delim cắt của bạn không giống nhau, điều này sẽ thất bại
asнι

Suy nghĩ bên tốt, mặc dù nếu tôi cài đặt, a="my string here"tôi cũng có thể sử dụng mở rộng tham số ${a##* }.
Arronical

1
Có, nhưng OP cho biết ông có một chuỗi phân tách không gian.
Severus Thục

2

Đây là một trong những sử dụng grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Làm thế nào nó hoạt động:

  • grep với -oIn chỉ các phần phù hợp (không trống) của một dòng phù hợp.
  • Các regrec [^ ]*$phù hợp với bất cứ điều gì từ cuối cho đến khi nó tìm thấy một không gian.

Một lớp lót khác từ glenn jackman sử dụng perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
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.