Saya harus memasukkan variabel bash pada baris pertama file. Saya kira itu dengan perintah grep, tetapi apakah ada cara untuk membatasi jumlah baris?
249
head
mengambil baris pertama dari file, dan -n
parameter dapat digunakan untuk menentukan berapa banyak baris yang harus diekstraksi:
line=$(head -n 1 filename)
read
pendekatan.$()
memotong subkulit, dan menggunakan perintah eksternal (perintah eksternal apa pun ) berarti Anda memanggilexecve()
, memanggil tautan dan pemuat (jika menggunakan pustaka bersama, yang biasanya merupakan kasus), dll.line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
membuka subkulit seperti$()
halnya?$()
sintaksis lebih mudah dilihat, dan menghargai kejelasan atas kepastian mutlak. gnu.org/software/bash/manual/html_node/…untuk membaca baris pertama menggunakan bash, gunakan
read
pernyataan. misalnyafirstline
akan menjadi variabel Anda (Tidak perlu menetapkan ke yang lain)sumber
cat ... | read VAR
akan gagal di sebagian besar shell (semua kecualizsh
sejauh yang saya tahu) karena masing-masing komponen dalam pipa akan berjalan di subkulit yang terpisah. Arti yang$VAR
akan diatur dalam subkulit (yang tidak ada segera setelah pipa selesai dieksekusi) daripada di shell yang memohon. Anda dapat menyiasati ini denganread VAR <<EOF\n$(cat ...)\nEOF
(di mana masing\n
- masing adalah baris baru).cat
adalah overhead murni; jauh lebih efisienread -r var <file
daripadacat file | read
bagaimana pun, bahkan jika yang terakhir tidak gagal karena alasan yang dijelaskan dalam BashFAQ # 24 .cat
, makaread -r var < <(otherprog ...)
Ini mencukupi dan menyimpan baris pertama
filename
dalam variabel$line
:Saya juga suka
awk
untuk ini:Untuk menyimpan garis itu sendiri, gunakan
var=$(command)
sintaksisnya. Dalam hal iniline=$(awk 'NR==1 {print; exit}' file)
,.Atau bahkan
sed
:Dengan yang setara
line=$(sed -n '1p' file)
.Lihat sampel saat kami memberi makan
read
denganseq 10
, yaitu, urutan angka dari 1 hingga 10:sumber
sed '1!d;q'
(ataused -n '1p;q'
) akan meniruawk
logika Anda dan mencegah pembacaan lebih jauh ke dalam file. Karena kami hanya ingin baris pertama, kita alternatif bisa menipu dengansed q
atauawk '1;{exit}'
atau bahkangrep -m1 ^
(kode kurang, logika penting yang sama). (Ini bukan balasan untuk pertanyaan downvote.)grep
sangat cerdas. Tentu saja kita juga bisa mengatakannyahead -n 1 file
.head -n1
akan lebih cepat (biner lebih kecil untuk dimuat) danread
akan tercepat (tidak ada biner untuk dimuat, itu bawaan). Saya terutama sukagrep -m1 --color .
ketika saya hanya mencetak baris pertama karena akan mewarnai garis juga, membuatnya bagus untuk judul tabel.Akan bekerja dengan baik. (Seperti jawaban sebelumnya). Tapi
akan sedikit lebih cepat seperti
read
perintah bash bawaan.sumber
read
tidak mencetak apa pun (jadiline
berakhir kosong), dan juga dijalankan dalam subkulit (jadiFIRSTLINE
diatur ke baris pertama, tetapi hanya dalam subkulit, sehingga tidak tersedia setelahnya). Solusi: cukup gunakanread -r line <filename
Hanya
echo
daftar pertama file sumber Anda ke file target Anda.sumber
head -n 1 source.txt > target.txt
akan mencapai hal yang persis sama.Pertanyaannya tidak menanyakan yang tercepat, tetapi untuk menambah jawaban sed, -n '1p' berkinerja buruk karena ruang pola masih dipindai pada file besar. Karena penasaran saya menemukan bahwa 'kepala' menang atas sed sempit:
sumber