Jika saya memiliki output yang sangat panjang dari sebuah perintah (baris tunggal) tetapi saya tahu saya hanya ingin karakter [x] pertama (katakanlah 8) dari output, apa cara termudah untuk mendapatkannya? Tidak ada pembatas.
command-line
shell
text-processing
xenoterracide
sumber
sumber
Jawaban:
Salah satu caranya adalah menggunakan
cut
:Ini akan memberi Anda 8 karakter pertama dari setiap baris output. Karena
cut
merupakan bagian dari POSIX, ia mungkin berada di sebagian besar Unix.sumber
cut -c
memilih karakter;cut -b
atauhead -c
memilih byte. Ini membuat perbedaan di beberapa lokal (dalam praktiknya, ketika menggunakan UTF-8).cut -c-8
akan memilih dari karakter 1 hingga 8.cut
setara dengan Windows?command | dd bs=8 count=1 2>/dev/null
. Tidak mengatakan itu lebih pendek atau lebih tinggi. Alternatif lain.cut
,cut -c
berfungsi seperticut -b
(yaitu, itu tidak berfungsi dengan baik untuk karakter multi-byte).Ini adalah beberapa cara lain untuk mendapatkan hanya 8 karakter pertama.
Dan jika Anda memiliki bash
sumber
command | sed 's/\(.\{8\}\).*/\1/'
atau jika mendukung sed Anda itu:command | sed -r 's/(.{8}).*/\1/'
; Kalau tidak, +1head -c
menghitung byte , bukan karakter. Demikian pula, di antara implementasi Awk utama, hanya awk GNU yang menangani karakter multi-byte dengan benar - FreeBSD Awk dan Mawk tidak.Jika Anda memiliki shell yang cukup canggih (misalnya, yang berikut ini akan bekerja di Bash, tidak yakin tentang tanda hubung), Anda dapat melakukannya:
Setelah dieksekusi
read ... <(command)
, karakter Anda akan berada di variabel shellREPLY
. Ketikhelp read
untuk mempelajari tentang opsi lain.Penjelasan:
-n8
argumen untukread
mengatakan bahwa kami ingin hingga 8 karakter. The-d$'\0'
mengatakan membaca sampai null, bukan untuk 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-n8 -d$'\0'
adalah menggunakan-N8
, yang bertuliskan tepat 8 karakter atau sampai stdin mencapai EOF. Tidak ada pembatas yang dimuliakan. Itu mungkin lebih sesuai dengan kebutuhan Anda, tetapi saya tidak tahu begitu saja berapa banyak cangkang yang dibaca yang-N
bertentangan dengan penghormatan-n
dan-d
. Melanjutkan penjelasannya:-r
bilang abaikan\
-escapes, sehingga, misalnya, kami memperlakukan\\
sebagai dua karakter, bukan sebagai tunggal\
.Akhirnya, kami melakukannya
read ... <(command)
daripadacommand | read ...
karena dalam bentuk kedua, bacaan dijalankan 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:
sumber
cut
.read -n <num>
; peringatan kecil: Bash 3.x (masih saat ini di OS) keliru menafsirkan<num>
sebagai jumlah byte dan dengan demikian gagal dengan karakter multi-byte; ini telah diperbaiki di Bash 4.x.Satu lagi solusi liner dengan menggunakan ekspansi parameter
sumber
x=8; echo ${word:0:$x}
alih-alih mengkode integer.Ini portabel:
Untuk membangun string dengan panjang karakter bervariasi, ada pertanyaan tersendiri di sini .
sumber
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 gunakanxxd
:Outputnya persis
$BYTES
bytes, kecualicommand
outputnya lebih pendek, maka outputnya persis seperti itu.sumber
cut
baris baru trailing adalah untuk memasukkannya ke:| tr -d '\n'