Odpowiednik polecenia „tail” w systemie Windows


107

Czy istnieje sposób na symulowanie polecenia * nix tail w wierszu poleceń systemu Windows? Mam plik i chcę wyciąć pierwsze n wierszy tekstu. Na przykład:

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
Nie headwyświetla tylko pierwszych n wierszy zamiast je pomijać?
Joey

Proszę, Chris, rozważ nowe odpowiedzi od 2009 roku, a dokładniej odpowiedź Amita Portnoya . Ponieważ Twoje pytanie jest ogólne, wielu użytkowników może znaleźć tę stronę internetową. I mogą przestać czytać odpowiedzi po pierwszej: odpowiedzi, którą zaakceptowałeś. Możesz zmienić zaakceptowaną odpowiedź na inną, bardziej aktualną do dzisiejszych możliwości. Pozdrawiam;)
olibre

Jestem trochę zdezorientowany. Pierwotne pytanie dotyczyło polecenia w stylu uniksowym head, ale żądane wyjście wyglądało tak, jakby tego brakowało tail. Wygląda na to, że odpowiedzi dotyczą, heada nie tail.
blakeoft

@blakeoft pierwotne pytanie dotyczyło zachowania tail, jednak tytuł mówiłhead
MM

Odpowiedzi:


89

Brak dokładnego odpowiednika. Jednak istnieje natywne polecenie DOS „more”, które ma opcję + n, która rozpocznie wypisywanie pliku po n-tym wierszu:

Komunikat DOS:

C:\>more +2 myfile.txt

Powyższe polecenie wyświetli wszystko po pierwszych 2 wierszach.
W rzeczywistości jest to odwrotność głowy Uniksa :

Konsola Unix:

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

Powyższe polecenie wydrukuje tylko pierwsze 2 wiersze pliku.


8
Nie, to nie to samo. tailzaczyna odliczać od końca pliku. Więc tail -2wydrukuje ostatnie dwie linie.
ADTC

5
Czy mogę również wydrukować pierwsze n znaków?
Qwerty,

@ADTC (moja wersja) tail nie obsługuje negatywów. tylko głowa robi (gnuwin32)
nl-x

@ nl-x -2nie jest liczbą ujemną. To tylko skrócona wersja -n 2(liczba wierszy). Niestety, zbyt wiele implementacji tailnie obsługuje -2, co jest bardzo niespójne z towarzyszącymi headimplementacjami, które to obsługują . Zbyt wiele razy mnie to irytowało.
ADTC

@ADTC Ah, przepraszam. Byłem zdezorientowany, z head -n -2czym różni się od head -n 2. Ale z ogonem ten drugi nie istnieje.
nl-x

111

Jeśli masz zainstalowany program Windows PowerShell (myślę, że jest dołączony od XP), możesz po prostu uruchomić z cmd.exe:

Dowództwo:

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

Ogonowa komenda:

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

lub bezpośrednio z PowerShell:

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


aktualizacja

PowerShell 3.0 (Windows 8 i nowsze) dodano Tailpolecenie z aliasem Last. Headi Firstaliasy do TotalCountzostały również dodane.

Tak więc polecenia można ponownie zapisać jako

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

Czy to nie zachowuje się jak headzamiast tail?
blakeoft

@blakeoft tak, tak ... Zaktualizowałem odpowiedź. To niesamowite, że minęło 2 lata i 17 głosów, zanim ktoś to skomentował.
Amit Portnoy

@blakeoft właśnie zdał sobie sprawę, że pytanie zostało zmienione! (patrz stackoverflow.com/posts/1295068/revisions). Początkowo prosił o polecenie główne ... zaktualizowane, aby zawierało obie odpowiedzi ...
Amit Portnoy

2
@AmitPortnoy Znalazłem inną odpowiedź gdzieś na tej wymianie stosów, mówiącą, że Get-Contentma teraz polecenie tail. Na przykład Get-content -Tail 5 file.txtwydrukuje pięć ostatnich wierszy pliku file.txt. Przy okazji, dziękujemy za zaktualizowanie odpowiedzi.
blakeoft

2
jakikolwiek sposób użyć go jako filtra? (np. czytanie stdin zamiast pliku)
eadmaster

24
more /e filename.txt P n

gdzie n = liczba wierszy do wyświetlenia. Działa szybko i jest dokładnie taki sam jak headpolecenie.


14
Polecenia takie jak P, S itp. Mogą być wprowadzane tylko przez użytkownika po wyświetleniu monitu. Nie można ich przekazać dowództwu more. Tak więc powyższy przykład nie działa
Philibert Perusse


12

To totalny hack, ale jeśli jest to ogromny plik, który chcesz po prostu sprawdzić format, nagłówek itp. I szukasz rozwiązania, zawsze możesz po prostu przekierować wyjście „więcej” do nowego pliku i CTRL-C szybko. Wiersze wyjściowe nie mogą być precyzyjnie kontrolowane i najprawdopodobniej zabijesz je w środku linii wyjścia, ale jest to tani sposób na przechwycenie małego fragmentu pliku, który w innym przypadku nie nadaje się do użytku.

Dawny.

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
linia 1
linia 2
itd ...... DO:\

9

Cóż, będzie to zrobić , ale to o tak szybko, jak to wygląda (mniej więcej O (N * m), gdzie n to liczba linii do wyświetlania i m to całkowita liczba linii w pliku):

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

Gdzie „10” to liczba wierszy, które chcesz wydrukować, a „nazwa pliku” to nazwa pliku.


6
+1 za rozwiązanie, którego wpisanie zajęło więcej czasu niż pobranie portu head.
Camilo Martin,

1
Uwaga: umieść to wyrażenie w nawiasach - (expr) > out.txt- podczas wysyłania wyników do pliku, w przeciwnym razie otrzymasz tylko ostatnią linię. Lub dołącz - expr >> out.txt.
cz

9

Powershell:

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

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

To jest poprawna odpowiedź, aktualna i istotna (w przeciwieństwie do cmd). Dzięki.
cudacoder

7

Używając więcej + n, o których Matt już wspomniał, aby uniknąć przerw w długich plikach, spróbuj tego:

więcej +1 myfile.txt> con

Kiedy przekierowujesz wyjście z more, nie zatrzymuje się - i tutaj przekierowujesz do konsoli. Możesz w podobny sposób przekierować do innego pliku, takiego jak ten, bez dodatkowych przerw, jeśli jest to pożądany efekt końcowy. Użyj>, aby przekierować do pliku i nadpisać go, jeśli już istnieje, lub >>, aby dołączyć do istniejącego pliku. (Można użyć do przekierowania do konta).



5

Get-content -Tail n file.txtz PowerShell to jedyna rzecz, która zbliża się do tailLinuksa.

Get-Content *filename* | Select-Object -last *n*Zasugerowano powyżej ładunku / analizować całość. Nie trzeba dodawać, że nie był zadowolony z mojego pliku dziennika o pojemności 10 GB ... -TailOpcja zaczyna się na końcu pliku.


2

Jeśli potrzebujesz polecenia head, jednym prostym sposobem na jego uzyskanie jest zainstalowanie Cygwin. Wtedy będziesz miał do dyspozycji wszystkie narzędzia UNIX.

Jeśli to nie jest dobre rozwiązanie, możesz spróbować użyć funkcji findstr i wyszukać wskaźnik końca linii.

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


2

Oto szybkie natywne polecenie head, które daje pierwsze 9 linii w DOS.

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

Pierwsze 2 znaki w każdym wierszu to numer wiersza.



2

w PS spróbuj użyć polecenia:

Select -Last 1

To polecenie może być również przetwarzane potokowo.

Przykład uzyskania pierwszej linii:

type .\out.txt | Select -Last 1

lub aby uzyskać pierwszą linię:

 type .\out.txt | Select -First 1

1

FWIW, dla tych, którzy muszą po prostu wyciąć nieokreśloną liczbę rekordów z nagłówka pliku, więcej> działa dobrze. Jest to przydatne po prostu mieć mniejszy plik do pracy na wczesnych etapach tworzenia czegoś.


1

Nie próbowałem wyodrębnić zakresu, ale udało mi się uzyskać wiersz za pomocą następującego polecenia DOS:

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

Ponieważ większość plików zawiera spacje, to polecenie pobiera każdy wiersz ze wszystkich plików LOG i zasadniczo numeruje je, zaczynając od 1 dla każdego pliku. Ponumerowane wyniki są następnie przesyłane do drugiego FINDpolecenia, które szuka linii oznaczonej jako numer 6.


1

Na tej stronie znajduje się bezpłatne headnarzędzie , z którego możesz skorzystać. Jeszcze tego nie próbowałem.


1
Nie wiem, dlaczego ten głos został odrzucony. Wykonuje się dokładnie tak samo, jak narzędzie head UNIX.
coson

1
To link do pobrania. Czy ma uuenkodować plik binarny i osadzić go w odpowiedzi?
GargantuChet

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

zwróci pierwszą linię twojego pliku w cmd Windows w zmiennej% line%.



-2

Myślę, że nie ma wyjścia po wyjęciu z pudełka. Nie ma takiego polecenia w DOS, a pliki wsadowe są ograniczone do symulacji (bez większego bólu).


-2

Ostrzeżenie, używanie możliwości pliku wsadowego dla, tokenów i separatorów przy wprowadzaniu nieznanego tekstu może być katastrofą ze względu na specjalną interpretację znaków, takich jak &,!, <Itd. Takie metody powinny być zarezerwowane tylko dla przewidywalnego tekstu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.