'Tail' komutunun Windows eşdeğeri


107

Windows komut satırında * nix tail komutunu simüle etmenin bir yolu var mı ? Bir dosyam var ve metnin ilk n satırını kesmenin bir yolunu istiyorum . Örneğin:

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

D:\>type result.txt
line two
line three

10
Does not headsadece ilk göstermek n onları bırakmak yerine hatları?
Joey

Lütfen Chris, 2009'dan beri yeni cevapları, daha özel olarak Amit Portnoy'un cevabını düşünün . Sorunuz genel olduğundan, birçok kullanıcı bu web sayfasını bulabilir. Ve ilk cevaptan sonra cevapları okumayı bırakabilirler: kabul ettiğiniz cevap. Kabul ettiğiniz cevabı, günümüzün olasılıklarına göre daha güncellenmiş bir başka cevapla değiştirebilirsiniz. Şerefe;)
olibre

Biraz kafam karıştı. Asıl soru Unix tarzı headkomutla ilgiliydi , ancak istenen çıktı istiyormuş gibi görünüyordu tail. Görünüşe göre cevaplar ilgili headdeğil tail.
blakeoft

@blakeoft orijinal soru davranışını soruyordu tail, ancak başlık dedi kihead
MM

Yanıtlar:


89

Tam eşdeğeri yok. Ancak, dosyanın n'inci satırından sonra çıktısını almaya başlayacak bir + n seçeneğine sahip yerel bir DOS komutu "more" vardır:

DOS İstemi:

C:\>more +2 myfile.txt

Yukarıdaki komut, ilk 2 satırdan sonraki her şeyi çıkaracaktır.
Bu aslında Unix kafasının tersidir :

Unix konsolu:

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

Yukarıdaki komut, dosyanın yalnızca ilk 2 satırını yazdıracaktır.


8
Hayır, aynı değil. taildosyanın sonundan itibaren saymaya başlar. Böylece tail -2son iki satırı yazdıracak.
ADTC

5
İlk n karakteri de yazdırabilir miyim?
Qwerty

@ADTC (benim sürümüm) tail negatifleri desteklemiyor. sadece kafa yapar (gnuwin32)
nl-x

@ nl-x -2negatif değildir. Bu, -n 2(satır sayısı) ifadesinin kısaltılmış halidir . Ne yazık ki, çok fazla uygulama taildesteklemiyor -2, bu da onu destekleyen headuygulamalarla çok tutarsız hale getiriyor . Beni pek çok kez kızdırdı.
ADTC

@ADTC Ah üzgünüm. head -n -2Hangisinin farklı olduğu ile karıştırdım head -n 2. Ancak kuyrukla, ikincisi mevcut değil.
nl-x

111

EĞER sahip Windows PowerShell yüklü sadece cmd.exe çalıştırabilirsiniz (Ben XP beri dahil düşünüyorum):

Baş Komuta:

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

Kuyruk Komutu:

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

veya doğrudan PowerShell'den:

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


Güncelleme

PowerShell 3.0 (Windows 8 ve üzeri) Tailtakma adla komut ekledi Last. Headve Firsttakma adlar TotalCountda eklendi.

Böylece komutlar şu şekilde yeniden yazılabilir:

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*

headBunun yerine böyle davranmıyor tailmu?
blakeoft

@blakeoft evet yaptı ... Cevabımı güncelledim. Birisi bu konuda yorum yapmadan önce 2 yıl 17 oy almış olması şaşırtıcı.
Amit Portnoy

@blakeoft, sorunun düzenlendiğini fark etti! (bkz. stackoverflow.com/posts/1295068/revisions). Başlangıçta head komutunu istedi ... her iki yanıtı da içerecek şekilde güncellendi ...
Amit Portnoy

2
@AmitPortnoy Bu yığın değişiminde bir yerde Get-Contentbir kuyruk komutu olduğunu söyleyen başka bir cevap buldum . Örneğin, Get-content -Tail 5 file.txtfile.txt dosyasının son beş satırını yazdıracaktır. Cevabınızı btw güncellediğiniz için teşekkür ederiz.
blakeoft

2
filtre olarak kullanmanın bir yolu var mı? (ör. dosya yerine stdin okuyarak)
eadmaster

24
more /e filename.txt P n

burada n = görüntülenecek satır sayısı. Hızlı çalışır ve tam olarak headkomut gibidir.


14
P, S vb. Gibi komutlar yalnızca kullanıcı tarafından komut isteminde girilebilir. Daha fazla komuta aktarılamazlar. Bu nedenle, yukarıdaki örnek işe yaramıyor
Philibert Perusse


12

Bu tam bir hack'tir, ancak sadece biçimi, başlığı vb. İncelemek istediğiniz büyük bir dosyaysa ve bir çözüm arıyorsanız, her zaman 'daha fazla' çıktısını yeni bir dosyaya ve CTRL-C'ye yönlendirebilirsiniz. hızlı bir şekilde. Çıktı satırları tam olarak kontrol edilemez ve büyük olasılıkla bir çıktı satırının ortasında onu öldüreceksiniz, ancak bu, normalde kullanılamayan bir dosyanın küçük bir parçasını almanın ucuz bir yoludur.

Örn.

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
satır 1
satır 2
vb ...... C: \

9

Peki, bu olacak yapmak o, ama () kabaca O (n * m, burada n ekran ve m hatlarının sayısı dosyasındaki toplam satır sayısı ise) yaklaşık olarak hızlı göründüğü kadar var:

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

Burada "10", yazdırmak istediğiniz satır sayısıdır ve "dosya adı" dosyanın adıdır.


6
Bir bağlantı noktasını indirmekten daha uzun süren bir çözüm için +1 head.
Camilo Martin

1
Not: (expr) > out.txtSonuçları bir dosyaya gönderirken bu ifadeyi köşeli parantez içine koyun - -, yoksa yalnızca son satırı alırsınız. Veya ekleyin - expr >> out.txt.
cz

9

Güç kalkanı:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)

Bu doğru cevap, güncel ve alakalı (cmd'nin aksine). Teşekkürler.
cudacoder

7

Matt'in bahsettiği daha fazla + n kullanırken, uzun dosyalarda duraklamaları önlemek için şunu deneyin:

daha +1 myfile.txt> con

Çıktıyı daha fazlasından yeniden yönlendirdiğinizde, duraklamaz ve burada konsola yönlendirirsiniz. İstediğiniz nihai sonuç buysa, benzer şekilde başka bir dosyaya, daha fazla duraklamadan yeniden yönlendirebilirsiniz. Dosyaya yeniden yönlendirmek ve zaten varsa üzerine yazmak için> veya mevcut bir dosyaya eklemek için >> öğesini kullanın. (Con'a yönlendirmek için ikisinden birini kullanabilir.)



5

Get-content -Tail n file.txtpowershell ile tailLinux'ta yaklaşan tek şey .

Yukarıda Get-Content *filename* | Select-Object -last *n*önerilen her şeyi yükler / ayrıştırır. Söylemeye gerek yok, 10GB günlük dosyamdan memnun değildi ... -TailSeçenek dosyanın sonundan başlıyor.



2

İşte size DOS'taki ilk 9 satırı veren hızlı bir yerel head komutu.

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

Her satırdaki ilk 2 karakter satır numarası olacaktır.



2

PS'de şu komutu kullanmayı deneyin:

Select -Last 1

Bu komut aynı zamanda ardışık düzenlenebilir.

İlk satırı alma örneği:

type .\out.txt | Select -Last 1

veya ilk satırı almak için:

 type .\out.txt | Select -First 1

1

FWIW, sadece dosyanın başından belirsiz sayıda kaydı kesmeye ihtiyaç duyanlar için, daha> iyi çalışıyor. Bu, bir şey geliştirmenin ilk aşamalarında çalışmak için daha küçük bir dosyaya sahip olmak için kullanışlıdır.


1

Bir aralığı çıkarmayı denemedim, ancak aşağıdaki DOS komutunu kullanarak bir satır elde edebildim:

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

Çoğu dosya boşluk içerdiğinden, bu komut tüm LOG dosyalarından her satırı çeker ve temelde her dosya için 1'den başlayarak numaralandırır. Numaralandırılmış sonuçlar daha sonra FIND6 numara olarak etiketlenmiş satırı arayan ikinci komuta aktarılır .


1

Bu sayfada kullanabileceğiniz ücretsiz bir headyardımcı program var . Henüz denemedim.


1
Bunun neden reddedildiğinden emin değilim. Bu çalıştırır tam UNIX baş programı gibi.
coson

1
Bu bir indirme bağlantısı. İkili kodu uuencode edip cevaba katması mı gerekiyor?
GargantuChet

0
set /p line= < file.csv 
echo %line%

dosyanızın ilk satırını cmd Windows'ta değişken% line% içinde döndürür.



-2

Kutudan çıkmanın bir yolu olduğunu sanmıyorum. DOS'ta böyle bir komut yoktur ve toplu iş dosyaları onu simüle etmek için çok sınırlıdır (büyük bir acı olmadan).


-2

Bilinmeyen metin girdisi için toplu iş dosyası, belirteçler ve sınırlama özelliğinin kullanılması, &,!, <, Vb. Gibi karakterlerin özel yorumlanması nedeniyle bir felaket olabilir. Bu tür yöntemler yalnızca tahmin edilebilir metin için ayrılmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.