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
Chris Smith
źródło
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
Możliwy duplikat szukania odpowiednika polecenia ogona w systemie Windows
Álvaro González

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.

Matthew Nizol
źródło
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*
Amit Portnoy
źródło
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.

Dan
źródło
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
17

Można dostać Coreutils z GnuWin32 , która jest zbiorem standardowych narzędzi Unix, przeniesione do systemu Windows.

Zawiera między innymi głowę.

Sebastian Paaske Tørholm
źródło
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:\
user2041301
źródło
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.

brianary
źródło
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)
Manuel Alves
źródło
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).

Zaraz
źródło
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.

Sebas
źródło
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

Zian Choy
źródło
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.

Don4x
źródło
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
Gico
źródło
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ś.

user382459
źródło
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.

sergioPinheiro
źródło
1

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

JeffH
źródło
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%.

Sergey Orlov
źródło
0

Jeśli chodzi o współczesną odpowiedź, w systemie Windows 10 można użyć „Podsystemu Linux dla Windows”.

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

Umożliwi to uruchamianie natywnych poleceń Linuksa z poziomu systemu Windows, a tym samym wykonywanie dokładnie tak, jak w systemie Linux.

Alex KeySmith
źródło
-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).

EricSchaefer
źródło
-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.

Ostrzeżenie dotyczące partii
źródło