Apakah ada perintah seperti cat
di linux yang dapat mengembalikan sejumlah karakter tertentu dari sebuah file?
misalnya, saya memiliki file teks seperti:
Hello world
this is the second line
this is the third line
Dan saya ingin sesuatu yang akan mengembalikan 5 karakter pertama, yaitu "halo".
Terima kasih
linux
command-line
pbreault
sumber
sumber
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
juga mengkonsumsi" world\n"
yang hilang selamanya.Jawaban:
head
bekerja juga:..akan mengekstrak 100 byte pertama dan mengembalikannya.
Apa yang bagus tentang menggunakan
head
untuk ini adalah sintaks untuktail
pertandingan:Anda dapat menggabungkan ini untuk mendapatkan rentang byte. Misalnya, untuk mendapatkan 100 byte kedua dari sebuah file, baca 200 byte pertama dengan
head
dan gunakan tail untuk mendapatkan 100 byte terakhir:sumber
head
, lalu gunakantail
untuk mendapatkan 10 byte terakhir, misalnya:head -c 20 file | tail -c 10
Anda dapat menggunakan dd untuk mengekstrak potongan byte yang berubah-ubah.
Sebagai contoh,
akan menyalin byte 1235 hingga 1239 dari input ke outputnya, dan membuang sisanya.
Untuk mendapatkan lima byte pertama dari input standar, lakukan:
Perhatikan bahwa, jika Anda ingin menentukan nama file input, dd memiliki parsing argumen model lama, jadi Anda akan melakukan:
Perhatikan juga bahwa dd secara verbal mengumumkan apa yang dilakukannya, jadi untuk membuangnya, lakukan:
atau
sumber
dd bs=1
memaksa dd untuk membaca dan menulis karakter tunggal pada satu waktu, yang jauh lebih lambat daripadahead
jika hitungannya besar. Ini tidak terlihat untuk hitungan = 5.dd
, tampaknya, akan berhasil .. Cheers!head -c
menerapkandd bs=5 count=1
pendekatan yang berhasilkepala :
Nama
head - mengeluarkan bagian pertama dari file
Ringkasan
kepala [ OPTION ] ... [ FILE ] ...
Deskripsi
Cetak 10 baris pertama dari setiap FILE ke keluaran standar. Dengan lebih dari satu FILE, awali masing-masing dengan header yang memberi nama file. Tanpa FILE, atau jika FILE adalah -, baca input standar.
Argumen wajib untuk opsi panjang juga wajib untuk opsi pendek.
-c , --bytes = [-] N mencetak N byte pertama dari setiap file; dengan awalan '-', cetak semua kecuali N byte terakhir dari setiap file
sumber
kepala atau ekor bisa melakukannya juga:
Mencetak byte X pertama (tidak harus karakter jika itu adalah file UTF-16) dari file tersebut. tail akan melakukan hal yang sama, kecuali untuk X byte terakhir.
Ini (dan potong) portabel.
sumber
skrip ini memberikan jumlah karakter yang tepat dari baris dan lokasi tertentu, misalnya:
memberikan karakter di baris 5 dan karakter 5 hingga 8 dari baris 5,
Catatan :
tail -1
digunakan untuk memilih baris terakhir yang ditampilkan oleh kepala.sumber
Anda juga bisa mengeluarkan garis dan memotongnya seperti misalnya:
grep nama file 'teks' | potong -c 1-5
sumber
Saya tahu jawabannya adalah sebagai jawaban atas pertanyaan yang diajukan 6 tahun yang lalu ...
Tetapi saya mencari sesuatu yang serupa selama beberapa jam dan kemudian menemukan bahwa: cut -c melakukan persis seperti itu, dengan bonus tambahan Anda juga dapat menentukan offset.
cut -c 1-5 akan mengembalikan Halo dan cut -c 7-11 akan mengembalikan dunia . Tidak perlu perintah lain
sumber
Meskipun ini telah dijawab / diterima bertahun-tahun yang lalu, jawaban yang diterima saat ini hanya benar untuk pengkodean satu byte per karakter seperti iso-8859-1, atau untuk subset byte tunggal dari kumpulan karakter byte variabel (seperti karakter Latin dalam UTF-8). Bahkan menggunakan sambungan multi-byte sebagai gantinya tetap hanya akan berfungsi untuk pengkodean multi-byte tetap seperti UTF-16. Mengingat bahwa sekarang UTF-8 sedang dalam perjalanan untuk menjadi standar universal, dan ketika melihat daftar bahasa ini berdasarkan jumlah penutur asli dan daftar 30 bahasa teratas menurut penggunaan penutur asli / sekunder , penting untuk menunjukkan teknik sederhana variabel-byte character-friendly (bukan berbasis byte), menggunakan
cut -c
dantr
/sed
dengan kelas-kelas karakter.Bandingkan hal berikut yang gagal ganda karena dua kesalahan / praduga Latin-sentris umum mengenai masalah byte vs. karakter (satu
head
vs.cut
, yang lain[a-z][A-Z]
vs.[:upper:][:lower:]
):untuk ini (catatan: ini berfungsi dengan baik di FreeBSD, tetapi baik
cut
&tr
di GNU / Linux masih mengacaukan bahasa Yunani di UTF-8 untuk saya):Jika Anda
cut
tidak menangani-c
pengkodean byte variabel dengan benar, untuk "X
karakter pertama " (gantiX
dengan nomor Anda), Anda dapat mencoba:sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- yang terbatas pada baris pertamahead -n 1 | grep -E -o '^.{X}'
- yang terbatas pada baris pertama dan menghubungkan dua perintah sekalipundd
- yang telah disarankan dalam jawaban lain, tetapi sangat merepotkansed
Skrip rumit dengan buffer jendela geser untuk menangani karakter yang tersebar di beberapa baris, tetapi itu mungkin lebih rumit / rapuh daripada hanya menggunakan sesuatu sepertidd
Jika Anda
tr
tidak menangani kelas karakter dengan pengkodean byte variabel dengan benar, Anda dapat mencoba:sed -E -e 's/[[:upper:]]/\L&/g
(Khusus GNU)sumber
printf 'Πού ' | cut -c 1
hanya mengembalikan omong kosong ... berperilaku seperti 'kepala'Berikut adalah skrip sederhana yang menyimpulkan menggunakan
dd
pendekatan yang disebutkan di sini:extract_chars.sh
sumber