Saya memiliki file teks yang saya hasilkan ke variabel dalam skrip shell saya. Saya hanya membutuhkan 50 karakter pertama.
Saya sudah mencoba menggunakan cat ${filename} cut -c1-50
tetapi saya mendapatkan lebih dari 50 karakter pertama? Itu mungkin karena cut
mencari baris (tidak 100% yakin), sementara file teks ini bisa menjadi satu string panjang - itu benar-benar tergantung.
Apakah ada utilitas di luar sana yang bisa saya gunakan untuk mendapatkan karakter X pertama dari sebuah cat
perintah?
|
?cat ${filename} | cut -c1-50
Jawaban:
Ini mengembalikan 50 byte pertama.
Pikiran bahwa perintah tidak selalu diimplementasikan sama pada semua OS. Di Linux dan macOS berperilaku seperti ini. Pada Solaris (11) Anda perlu menggunakan versi gnu di / usr / gnu / bin /
sumber
-c
pilihan. Saya akan memilih dd (1) .GNU coreutils 5.97
) tidak.-c
sebagai opsi yang valid, jadi itu pasti tergantung pada lingkungan lokal Anda. unix.com/man-page/posix/1/headcut
Perintah Anda berfungsi jika Anda menggunakan pipa untuk meneruskan data ke dalamnya:Atau, menghindari penggunaan kucing yang tidak berguna dan membuatnya sedikit lebih aman:
Perhatikan bahwa perintah di atas akan mencetak 50 karakter pertama (atau byte, tergantung pada
cut
implementasi Anda ) dari setiap baris input . Seharusnya melakukan apa yang Anda harapkan jika, seperti yang Anda katakan, file Anda adalah satu baris besar.sumber
Ini mengembalikan 50 byte pertama.
sumber
status=none
flag. Gunakan2>/dev/null
sebaliknya (dan kutip dengan benar):dd if="$filename" bs=1 count=50 2>/dev/null
(meski begitu, pertimbangkanbs=50 count=1
untuk menggunakan untuk mengurangi jumlah syscalls yang terlibat).status=none
ketika menggunakan Ubuntu 14.04, coreutils 8.21, tetapi Anda benar untuk digunakan2>/dev/null
jika menggunakan versi sebelumnya.read()
dari 50 byte. Jikafile
contohnya adalah pipa dan lebih sedikit karakter yang tersedia pada saat itu, maka lebih sedikit byte yang akan dikembalikan. Agar setarahead -c50
, Anda harus menggunakan GNU spesifikiflag=fullblock
.Sebagian besar jawaban sejauh ini berasumsi bahwa 1 byte = 1 karakter, yang mungkin tidak terjadi jika Anda menggunakan lokal non-ASCII.
Cara yang sedikit lebih kuat untuk melakukannya:
Perhatikan bahwa ini mengasumsikan:
ksh93
,bash
(atau yang terbaruzsh
ataumksh
(meskipun charset multi-byte hanya didukung olehmksh
adalah UTF-8 dan hanya setelahset -o utf8-mode
)) dan versihead
yang mendukung-c
(kebanyakan dilakukan saat ini, tetapi tidak sepenuhnya standar).locale charmap
danfile -- "$filename"
periksa itu); jika tidak, atur dengan ie.LC_ALL=en_US.UTF-8
)head
, dengan asumsi kasus terburuk UTF-8 di mana semua karakter dikodekan paling banyak 4 byte. Ini harus mencakup sebagian besar kasus yang dapat saya pikirkan.sumber
head
, atau implementasi lain yang menambahkan opsi nōn-standar-c
. Tapi Anda sudah membutuhkan GNU bash. (Catatan:mksh
Mode UTF-8 dapat melakukan ini untuk file yang disandikan UTF-8.) Saya akan bertanya kepada OP apakah mereka memerlukan oktet atau karakter multibyte, hanya "karakter" adalah istilah yang samar-samar / gerner.$filename
atau$testString
tidak mengandung baris baru kosong atau wildcard atau mulai dengan-
.${var:offset:length}
membangun Anda menggunakan sini benar-benar berasal dariksh93
dan juga didukung oleh versi terbaru darizsh
(zsh
memiliki sendiri$testString[1,50]
). Anda perlu${testString:0:50}
diksh93
danzsh
namun.Varian lain (untuk file baris pertama)
sumber
read
danecho
? Ataubash expansion
?grep
(regexp), dan ya, penggunaan shell di sini (petunjuk: baris pertama mungkin besar). (Seperti yang dikatakan, bashismenya juga tidak ada di POSIX, tetapi sebagian besar shell mengimplementasikannya.)1. Untuk file ASCII, lakukan seperti @DisplayName mengatakan:
akan mencetak 50 karakter pertama file.txt, misalnya.
2. Untuk data biner, gunakan
hexdump
untuk mencetaknya sebagai hex hexar:akan mencetak 50 byte pertama file.bin, misalnya.
Perhatikan bahwa tanpa
-v
opsi verbose,hexdump
akan menggantikan baris berulang dengan tanda bintang (*
). Lihat di sini: https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613 .sumber
Anda dapat menggunakan sed untuk ini yang akan mengatasi masalah dengan cukup mudah
sumber
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}