Apakah ada cara untuk membuat perintah cut hanya membaca bidang terakhir?

10

Saya memiliki string yang dipisahkan spasi yang dihasilkan oleh perintah, yang ingin saya beri pipa cut, gunakan -fd ' 'untuk membagi spasi. Saya tahu saya bisa menggunakan -f <n>untuk menampilkan nomor bidang <n>, tetapi bisakah saya membuatnya menampilkan bidang terakhir jika saya tidak tahu panjang string?

Atau apakah saya perlu menggunakan alat pengedit teks yang lebih fleksibel seperti sedatau awk?

Arronikal
sumber
Saya pikir perintah cut tidak dapat mendukung, tetapi tidak yakin, apakah Anda sudah mencoba dengan cut -d '' -f-?
αғsнιη
3
Cara lain untuk melakukannya: stackoverflow.com/questions/22727107/…
edwinksl
@KasiyA -nmenjadikannya n dari awal, n-dari n hingga akhir, dan ada --complementopsi yang membalikkan seleksi. Tetapi tidak ada cara untuk menghitung jumlah bidang dan bertindak sejauh yang saya tahu.
Arronical

Jawaban:

12

Tidak, cuttidak bisa. Anda bisa menggunakan dua revperintah, seperti

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

tetapi biasanya lebih mudah digunakan awk:

echo 'foo bar baz' | awk '{print $(NF)}'
Florian Diesch
sumber
7

Anda dapat melakukan ini hanya dengan menggunakan shell, tidak ada alat eksternal yang diperlukan, menggunakan Ekspansi Parameter:

${var##* }

var##*akan membuang semuanya dari mulai hingga ruang terakhir dari parameter (variabel) var.

Jika pembatas dapat berupa spasi kosong, misalnya spasi atau tab, gunakan kelas karakter [:blank:]:

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

Contoh:

$ var='foo bar spam egg'

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


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

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg
heemayl
sumber
Saya telah berbicara tentang menggunakan ekspansi parameter dalam komentar pada jawaban Severus Tux, tetapi kelas karakter kosong adalah informasi yang berguna, terima kasih.
Arronical
4

Saya pribadi suka jawaban Florian Diesch. Tapi ada juga cara ini.

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

Penjelasan:

wc -wmemberi jumlah kata. dan cutmemotong kata terakhir

EDIT:

Saya menemukan cara lain untuk Melakukannya:

echo "Any random string here" | tac -s' ' | head -1
Severus Tux
sumber
Benar, tetapi ini benar ketika delim adalah spasi atau tab, dan jika cut delim Anda tidak sama, ini akan gagal
αғsнιη
Pemikiran lateral yang bagus, meskipun jika saya setting a="my string here"saya bisa menggunakan ekspansi parameter ${a##* }juga.
Arronical
1
Ya, tetapi OP mengatakan dia memiliki string yang dipisahkan ruang.
Severus Tux
2

Ini salah satunya menggunakan grep

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

Bagaimana itu bekerja:

  • grep dengan -oMencetak hanya bagian yang cocok (tidak kosong) pada baris yang cocok.
  • Regexp [^ ]*$mencocokkan apa pun dari ujung hingga menemukan spasi.

Satu lagi liner dari glenn jackman menggunakan perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
souravc
sumber