it-swarm-id.com

Mengambil karakter [x] pertama untuk string dari pipa

Jika saya memiliki output yang sangat panjang dari sebuah perintah (baris tunggal) tetapi saya tahu saya hanya menginginkan karakter [x] pertama (misalkan 8) dari output, apa cara termudah untuk mendapatkannya? Tidak ada pembatas.

67
xenoterracide

Salah satu caranya adalah dengan menggunakan cut:

 command | cut -c1-8

Ini akan memberi Anda 8 karakter pertama dari setiap baris output. Karena cut adalah bagian dari POSIX, ia kemungkinan berada di sebagian besar Unix.

95
Steven D

Ini adalah beberapa cara lain untuk mendapatkan hanya 8 karakter pertama.

command | head -c8

command | awk '{print substr($0,1,8);exit}' 

command | sed 's/^\(........\).*/\1/;q'

Dan jika Anda memiliki bash

var=$(command)
echo ${var:0:8}
26
user1606

Satu lagi solusi liner dengan menggunakan parameter ekspansi

echo ${Word:0:x}

EG: Word="Hello world"
echo ${Word:0:3} or echo ${Word::3} 
o/p: Hel


EG.2: Word="Hello world"
echo ${Word:1:3}
o/p: ell
2

Jika Anda memiliki Shell yang cukup canggih (misalnya, yang berikut ini akan berfungsi di Bash, tidak yakin tentang tanda hubung), Anda dapat melakukannya:

read -n8 -d$'\0' -r <(command)

Setelah menjalankan read ... <(command), karakter Anda akan berada di variabel Shell REPLY. Ketik help read Untuk mempelajari tentang opsi lain.

Penjelasan: argumen -n8 Ke read mengatakan bahwa kami ingin hingga 8 karakter. The -d$'\0' Mengatakan baca sampai nol, bukan ke baris baru. Dengan cara ini pembacaan akan berlanjut selama 8 karakter bahkan jika salah satu karakter sebelumnya adalah baris baru (tetapi tidak jika itu nol). Alternatif untuk -n8 -d$'\0' Adalah dengan menggunakan -N8, Yang bertuliskan tepat 8 karakter atau hingga stdin mencapai EOF. Tidak ada pembatas yang dimuliakan. Itu mungkin lebih sesuai dengan kebutuhan Anda, tetapi saya tidak tahu berapa banyak cangkang yang membaca -N Yang bertentangan dengan penghormatan -n Dan -d. Melanjutkan penjelasan: -r Mengatakan abaikan \ - lolos, sehingga, misalnya, kami memperlakukan \\ Sebagai dua karakter, bukan sebagai satu-satunya \.

Akhirnya, kita melakukan read ... <(command) daripada command | read ... Karena dalam bentuk kedua, pembacaan dieksekusi dalam subkulit yang kemudian segera keluar, kehilangan informasi yang baru saja Anda baca.

Pilihan lain adalah melakukan semua pemrosesan Anda di dalam subkulit. Sebagai contoh:

$ echo abcdefghijklm | { read -n8 -d$'\0' -r; printf "REPLY=<%s>\n" "$REPLY"; }
REPLY=<abcdefgh>
2
dubiousjim

Ini portabel:

a="$(command)"             # Get the output of the command.
b="????"                   # as many ? as characters are needed.
echo ${a%"${a#${b}}"}      # select that many chars from $a

Untuk membangun string dengan panjang variabel karakter telah pertanyaannya sendiri di sini .

1
user79743

Saya punya masalah ini ketika secara manual membuat file checksum di repositori maven. Sayangnya cut -c selalu mencetak baris baru di akhir output. Untuk menekan yang saya gunakan xxd:

command | xxd -l$BYTES | xxd -r

Ini menghasilkan persis $BYTES byte, kecuali output command lebih pendek, maka output itu persis.