Windows setara dengan perintah 'tail'

107

Apakah ada cara untuk mensimulasikan perintah * nix tail pada baris perintah Windows? Saya memiliki file dan saya ingin cara untuk memotong n baris pertama teks. Sebagai contoh:

D:\>type file.txt
line one
line two
line three
D:\>*[call to tail]* > result.txt

D:\>type result.txt
line two
line three
Chris Smith
sumber
10
Tidak headhanya menampilkan n baris pertama, bukan mengosongkannya?
Joey
Mohon Chris mempertimbangkan jawaban baru sejak 2009, lebih khusus lagi jawaban Amit Portnoy . Karena pertanyaan Anda bersifat umum, banyak pengguna mungkin menemukan halaman web ini. Dan mereka mungkin berhenti membaca jawaban setelah yang pertama: jawaban yang Anda terima. Anda dapat mengubah jawaban yang telah Anda terima ke jawaban lain yang lebih diperbarui untuk kemungkinan saat ini. Cheers;)
olibre
Saya sedikit bingung. Pertanyaan aslinya adalah tentang headperintah gaya Unix , tetapi keluaran yang diinginkan tampak seperti itu tail. Sepertinya jawabannya adalah tentang headdan bukan tail.
blakeoft
@blakeoft pertanyaan awal menanyakan perilaku tail, namun judulnya mengatakanhead
MM
Kemungkinan duplikat Mencari jendela yang setara dengan perintah ekor unix
Álvaro González

Jawaban:

89

Tidak ada padanan persis. Namun ada perintah DOS asli "more" yang memiliki opsi + n yang akan mulai mengeluarkan file setelah baris ke-n:

Perintah DOS:

C:\>more +2 myfile.txt

Perintah di atas akan menampilkan semuanya setelah 2 baris pertama.
Ini sebenarnya kebalikan dari kepala Unix :

Konsol Unix:

root@server:~$ head -2 myfile.txt

Perintah di atas hanya akan mencetak 2 baris pertama file.

Matthew Nizol
sumber
8
Tidak, ini tidak sama. tailmulai menghitung dari akhir file. Jadi, tail -2akan mencetak dua baris terakhir.
ADTC
5
Bisakah saya mencetak n karakter pertama juga?
Qwerty
@ ADTC (versi saya) tail tidak mendukung hal-hal negatif. hanya kepala yang melakukannya (gnuwin32)
nl-x
@ nl-x -2bukan negatif. Ini hanya versi singkatan dari -n 2(jumlah baris). Sayangnya, terlalu banyak implementasi tailyang tidak mendukung -2, sehingga sangat tidak konsisten dengan headimplementasi yang mendukung . Itu sudah terlalu sering membuatku kesal.
ADTC
@ADTC Ah maaf. Saya bingung head -n -2mana yang berbeda head -n 2. Tetapi dengan ekor, yang terakhir tidak ada.
nl-x
111

JIKA Anda menginstal Windows PowerShell (saya pikir itu termasuk sejak XP), Anda dapat menjalankan dari cmd.exe:

Perintah Kepala:

powershell -command "& {Get-Content *filename* -TotalCount *n*}"

Perintah Ekor:

powershell -command "& {Get-Content *filename* | Select-Object -last *n*}"

atau, langsung dari PowerShell:

Get-Content *filename* -TotalCount *n*
Get-Content *filename* | Select-Object -last *n*


memperbarui

PowerShell 3.0 (Windows 8 dan lebih tinggi) menambahkan Tailperintah dengan alias Last. Headdan Firstalias TotalCountjuga ditambahkan.

Jadi, perintah dapat ditulis ulang sebagai

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Amit Portnoy
sumber
Tidak berperilaku ini seperti headbukan tail?
blakeoft
@blakeoft ya memang ... Saya telah memperbarui jawaban saya. Sungguh menakjubkan bahwa butuh 2 tahun dan 17 suara sebelum seseorang mengomentari ini.
Amit Portnoy
@blakeoft baru menyadari bahwa pertanyaannya telah diedit! (lihat stackoverflow.com/posts/1295068/revision). Ini awalnya meminta perintah kepala ... diperbarui untuk memasukkan kedua jawaban ...
Amit Portnoy
2
@AmitPortnoy Saya menemukan jawaban lain di suatu tempat di pertukaran tumpukan ini mengatakan bahwa sekarang Get-Contentmemiliki perintah ekor. Misalnya, Get-content -Tail 5 file.txtakan mencetak lima baris terakhir file.txt. Terima kasih telah memperbarui jawaban Anda btw.
blakeoft
2
cara apa pun untuk menggunakannya sebagai filter? (mis. membaca stdin alih-alih file)
eadmaster
24
more /e filename.txt P n

dimana n = jumlah baris yang akan ditampilkan. Bekerja cepat dan persis seperti headperintah.

Dan
sumber
14
Perintah seperti P, S, dll. Hanya dapat dimasukkan oleh pengguna saat diminta. Mereka tidak dapat diteruskan ke lebih banyak perintah. Jadi, contoh di atas tidak berfungsi
Philibert Perusse
17

Anda bisa mendapatkan CoreUtils dari GnuWin32 , yang merupakan kumpulan alat unix standar, yang di-porting ke Windows.

Itu antara lain berisi kepala.

Sebastian Paaske Tørholm
sumber
12

Ini adalah peretasan total tetapi jika itu adalah file besar yang ingin Anda periksa format, tajuk, dll. Dan Anda sedang mencari solusi, Anda selalu dapat mengarahkan keluaran 'lebih banyak' ke file baru dan CTRL-C segera. Baris keluaran tidak dapat dikontrol secara tepat dan Anda kemungkinan besar akan membunuhnya di tengah baris keluaran tetapi ini cara yang murah untuk mengambil sedikit dari file yang tidak dapat digunakan.

Ex.

C: \ lebih test.csv> test.txt 
^ C C: \ lebih test.txt
baris 1
baris 2
dll ...... C: \
pengguna2041301
sumber
9

Nah, ini akan melakukannya , tapi secepat yang terlihat (kira-kira O (n * m), di mana n adalah jumlah baris yang akan ditampilkan dan m adalah jumlah total baris dalam file):

for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" filename ^| findstr /r "^%l:"') do @echo %b

Di mana "10" adalah jumlah baris yang ingin Anda cetak, dan "nama file" adalah nama file.

brianari
sumber
6
+1 untuk solusi yang membuat Anda mengetik lebih lama daripada mengunduh porta head.
Camilo Martin
1
Catatan: Letakkan ekspresi ini dalam tanda kurung - (expr) > out.txt- saat mengirimkan hasil ke file, atau Anda hanya akan mendapatkan baris terakhir. Atau tambahkan - expr >> out.txt.
cz
9

Powershell:

Get-Content C:\logs\result.txt -Tail 10

Get-Content C:\logs\result.txt -wait (monitor the tail)
Manuel Alves
sumber
Ini adalah jawaban yang benar, terkini dan relevan (tidak seperti cmd). Terima kasih.
cudacoder
7

Saat menggunakan lebih banyak + n yang telah disebutkan Matt, untuk menghindari jeda di file yang panjang, coba ini:

lainnya +1 myfile.txt> con

Ketika Anda mengarahkan output dari lebih banyak, itu tidak berhenti - dan di sini Anda mengarahkan ke konsol. Anda juga dapat mengarahkan ke beberapa file lain seperti ini tanpa jeda lebih banyak jika itu hasil akhir yang Anda inginkan. Gunakan> untuk mengalihkan ke file dan menimpanya jika sudah ada, atau >> untuk menambahkan ke file yang sudah ada. (Dapat digunakan untuk mengalihkan ke penipu.)

Segera
sumber
5

Get-content -Tail n file.txtdengan PowerShell adalah satu-satunya hal yang mendekati taildi linux.

Yang Get-Content *filename* | Select-Object -last *n*disarankan di atas memuat / mengurai semuanya. Tak perlu dikatakan, itu tidak senang dengan file log 10GB saya ... -TailOpsi ini dimulai pada akhir file.

Sebas
sumber
2

Jika Anda menginginkan perintah head, salah satu cara mudah untuk mendapatkannya adalah dengan menginstal Cygwin. Maka Anda akan memiliki semua alat UNIX yang Anda inginkan.

Jika itu bukan solusi yang baik, maka Anda dapat mencoba menggunakan findstr dan melakukan pencarian untuk indikator akhir baris.

findstr di MSDN: http://technet.microsoft.com/en-us/library/bb490907.aspx

Zian Choy
sumber
2

Berikut adalah perintah kepala asli cepat yang memberi Anda 9 baris pertama di DOS.

findstr /n "." myfile.txt | findstr "^.:"

2 karakter pertama di setiap baris akan menjadi nomor baris.

Don4x
sumber
2

di PS coba gunakan perintah:

Select -Last 1

Perintah ini juga dapat disambungkan.

Contoh untuk mendapatkan baris pertama:

type .\out.txt | Select -Last 1

atau untuk mendapatkan baris pertama:

 type .\out.txt | Select -First 1
Gico
sumber
1

FWIW, bagi mereka yang hanya perlu memotong sejumlah catatan tak tentu dari kepala berkas, lebih> bekerja dengan baik. Ini berguna hanya untuk memiliki file yang lebih kecil untuk dikerjakan pada tahap awal pengembangan sesuatu.

pengguna382459
sumber
1

Saya belum mencoba mengekstrak rentang, tetapi saya bisa mendapatkan baris menggunakan perintah DOS berikut:

find /N " " *.log|find "[6]" 

Karena kebanyakan file berisi spasi, perintah ini menarik setiap baris dari semua file LOG dan pada dasarnya menomori mereka mulai dari 1 untuk setiap file. Hasil bernomor kemudian disalurkan ke FINDperintah kedua yang mencari baris yang diberi tag sebagai nomor 6.

sergioPinheiro
sumber
1

Ada headutilitas gratis di halaman ini yang dapat Anda gunakan. Saya belum mencobanya.

JeffH
sumber
1
Tidak yakin mengapa ini tidak disukai. Ini dijalankan persis seperti utilitas kepala UNIX.
coson
1
Ini adalah tautan unduhan. Apakah dia seharusnya uuencode biner dan menyematkannya dalam jawaban?
GargantuChet
0
set /p line= < file.csv 
echo %line%

itu akan mengembalikan baris pertama file Anda di cmd Windows dalam variabel% baris%.

Sergey Orlov
sumber
0

Sebagai jawaban kontemporer, jika menjalankan Windows 10 Anda dapat menggunakan "Linux Subsystem for Windows".

https://docs.microsoft.com/en-us/windows/wsl/install-win10

Ini akan memungkinkan Anda untuk menjalankan perintah linux asli dari dalam jendela dan dengan demikian menjalankan ekor persis seperti yang Anda lakukan di linux.

Alex KeySmith
sumber
-2

Saya tidak berpikir ada jalan keluar dari kotak. Tidak ada perintah seperti itu di DOS dan file batch sangat terbatas untuk mensimulasikannya (tanpa kesulitan besar).

EricSchaefer
sumber
-2

Peringatan, menggunakan file batch untuk, token, dan kemampuan delims pada input teks yang tidak dikenal bisa menjadi bencana karena interpretasi khusus dari karakter seperti &,!, <, Dll. Metode tersebut harus disediakan hanya untuk teks yang dapat diprediksi.

Peringatan Batch
sumber