Эквивалент Windows команды 'tail'

107

Есть ли способ имитировать команду * nix tail в командной строке Windows? У меня есть файл, и мне нужен способ вырезать первые n строк текста. Например:

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
Не headпоказывает только первые n строк вместо их пропуска?
Joey
Пожалуйста, Крис рассмотрите новые ответы с 2009 года, а точнее ответ Амита Портного . Поскольку ваш вопрос является общим, многие пользователи могут найти эту веб-страницу. И они могут перестать читать ответы после первого: ответа, который вы приняли. Вы можете изменить ответ, который вы приняли, на другой, более обновленный до современных возможностей. Cheers;)
olibre
Я немного запутался. Первоначальный вопрос касался headкоманды стиля Unix , но желаемый результат выглядел так, как будто его не хватало tail. Похоже ответы о том, headа не о tail.
blakeoft 04
@blakeoft исходный вопрос спрашивал о поведении tail, однако в названии говорилосьhead
MM
Возможный дубликат поиска в Windows эквивалента команды unix tail
Альваро Гонсалес

Ответы:

89

Нет точного эквивалента. Однако существует собственная команда DOS "more", у которой есть опция + n, которая начнет вывод файла после n-й строки:

Подсказка DOS:

C:\>more +2 myfile.txt

Приведенная выше команда выведет все после первых двух строк.
На самом деле это обратная голова Unix :

Консоль Unix:

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

Вышеупомянутая команда напечатает только первые 2 строки файла.

Мэтью Низол
источник
8
Нет, это не то же самое. tailначинает отсчет с конца файла. Итак, tail -2напечатаем две последние строчки.
ADTC
5
Могу ли я также напечатать первые n символов?
Qwerty
@ADTC (моя версия) tail не поддерживает негативы. only head does (gnuwin32)
nl-x
@ nl-x -2не является отрицательным. Это просто сокращенная версия -n 2(количество строк). К сожалению, слишком много реализаций tailне поддерживают -2, что делает его очень несовместимым с сопутствующими headреализациями, которые поддерживают. Меня это слишком много раз раздражало.
ADTC
@ADTC Извините. Меня смутило, head -n -2что отличается от head -n 2. А вот с хвостом последнего не существует.
nl-x
111

ЕСЛИ у вас установлена Windows PowerShell (я думаю, что она включена с XP), вы можете просто запустить cmd.exe:

Глава команды:

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

Команда хвоста:

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

или прямо из PowerShell:

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


Обновить

В PowerShell 3.0 (Windows 8 и выше) добавлена Tailкоманда с псевдонимом Last. Headи Firstпсевдонимы для TotalCount.

Итак, команды можно переписать как

Get-Content *filename* -Head *n*
Get-Content *filename* -Tail *n*
Амит Портной
источник
Разве это не похоже на headвместо tail?
blakeoft 04
@blakeoft да ... Я обновил свой ответ. Удивительно, что потребовалось 2 года и 17 голосов, прежде чем кто-то прокомментировал это.
Амит Портной,
@blakeoft только что понял, что вопрос отредактировали! (см. stackoverflow.com/posts/1295068/revisions). Первоначально он запрашивал команду head ... обновлен, чтобы включить оба ответа ...
Амит Портной
2
@AmitPortnoy Я нашел еще один ответ где-то на этом обмене стеками, в котором говорится, что Get-Contentтеперь есть хвостовая команда. Например, Get-content -Tail 5 file.txtнапечатает последние пять строк файла file.txt. Кстати, спасибо за обновление вашего ответа.
blakeoft 05
2
каким-либо способом использовать его как фильтр? (например, чтение stdin вместо файла)
eadmaster
24
more /e filename.txt P n

где n = количество отображаемых строк. Работает быстро и в точности как headкоманда.

Дэн
источник
14
Такие команды, как P, S и т. Д., Могут вводиться только пользователем в командной строке. Их нельзя передать команде more. Таким образом, приведенный выше пример не работает
Philibert Perusse
17

Вы можете получить CoreUtils из GnuWin32 , который представляет собой набор стандартных инструментов unix, перенесенных на Windows.

В нем, помимо прочего, находится голова.

Себастьян Паске Торхольм
источник
12

Это полный взлом, но если это огромный файл, который вы хотите просто изучить формат, заголовок и т. Д., И ищете решение, вы всегда можете просто перенаправить вывод `` больше '' в новый файл и CTRL-C быстро. Строки вывода нельзя точно контролировать, и вы, скорее всего, убьете его в середине строки вывода, но это дешевый способ получить небольшой кусочек файла, который иначе непригоден для использования.

Ex.

C: \ more test.csv> test.txt 
^ C C: \ more test.txt
строка 1
строка 2 и
т. Д. ...... C: \
user2041301
источник
9

Что ж, это сделает это, но это примерно так же быстро, как кажется (примерно O (n * m), где n - количество отображаемых строк, а m - общее количество строк в файле):

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

Где «10» - это количество строк, которые вы хотите напечатать, а «filename» - это имя файла.

брианарий
источник
6
+1 за решение, на ввод которого у вас ушло больше времени, чем на загрузку порта head.
Камило Мартин
1
Примечание: заключите это выражение в скобки - (expr) > out.txt- при отправке результатов в файл, иначе вы получите только последнюю строку. Или добавьте - expr >> out.txt.
cz
9

Powershell:

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

Get-Content C:\logs\result.txt -wait (monitor the tail)
Мануэль Алвес
источник
Это правильный ответ, актуальный и актуальный (в отличие от cmd). Спасибо.
cudacoder
7

При использовании more + n, о котором уже упоминал Мэтт, чтобы избежать пауз в длинных файлах, попробуйте следующее:

еще +1 myfile.txt> con

Когда вы перенаправляете вывод из more, он не останавливается - и здесь вы перенаправляете на консоль. Вы можете аналогичным образом перенаправить на другой файл, подобный этому, без дополнительных пауз, если это ваш желаемый конечный результат. Используйте>, чтобы перенаправить в файл и перезаписать его, если он уже существует, или >>, чтобы добавить в существующий файл. (Можно использовать либо для перенаправления на con.)

Анон
источник
5

Get-content -Tail n file.txtс PowerShell - это единственное, что близко к tailLinux.

Get-Content *filename* | Select-Object -last *n*Предложено выше нагрузок / синтаксического целого. Излишне говорить, что он был недоволен моим файлом журнала размером 10 ГБ ... Эта -Tailопция действительно запускается в конце файла.

Себас
источник
2

Если вам нужна команда head, один из простых способов получить ее - установить Cygwin. Тогда в вашем распоряжении будут все инструменты UNIX.

Если это не лучшее решение, вы можете попробовать использовать findstr и выполнить поиск индикатора конца строки.

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

Зиан Чой
источник
2

Вот быстрая родная команда head, которая дает вам первые 9 строк в DOS.

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

Первые 2 символа в каждой строке будут номером строки.

Don4x
источник
2

Существует набор ресурсов, который можно загрузить отсюда: http://www.microsoft.com/downloads/en/confirmation.aspx?familyId=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displayLang=en

Он содержит инструмент tail.exe, но совместим только с некоторыми версиями Windows.

(Скопировано из этого сообщения: Команда Tail для Windows )

Распутино
источник
2

в PS попробуйте использовать команду:

Select -Last 1

Эта команда также может быть конвейерной.

Пример получения первой строки:

type .\out.txt | Select -Last 1

или получить первую строку:

 type .\out.txt | Select -First 1
Gico
источник
1

FWIW, для тех, кому просто нужно вырезать неопределенное количество записей из заголовка файла, подойдет more> . Это полезно только для того, чтобы иметь файл меньшего размера для работы на ранних этапах разработки чего-либо.

user382459
источник
1

Я не пробовал извлекать диапазон, но мне удалось получить строку, используя следующую команду DOS:

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

Поскольку большинство файлов содержат пробелы, эта команда извлекает каждую строку из всех файлов LOG и в основном нумерует их, начиная с 1 для каждого файла. Затем пронумерованные результаты передаются во вторую FINDкоманду, которая ищет строку с тегом 6.

sergioPinheiro
источник
1

На этой странице есть бесплатная headутилита, которую вы можете использовать. Еще не пробовал.

Джефф
источник
1
Не уверен, почему это было отклонено. Она работает точно так же, как и утилита head UNIX.
coson
1
Это ссылка для скачивания. Должен ли он кодировать двоичный файл и вставлять его в ответ?
GargantuChet
0
set /p line= < file.csv 
echo %line%

он вернет первую строку вашего файла в cmd Windows в переменной% line%.

Сергей Орлов
источник
0

Как современный ответ, если вы используете Windows 10, вы можете использовать «Подсистему Linux для Windows».

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

Это позволит вам запускать собственные команды Linux из окон и, таким образом, запускать tail точно так же, как в Linux.

Алекс КейСмит
источник
-2

Не думаю, что есть выход из коробки. В DOS такой команды нет, и пакетные файлы далеко не ограничены для ее моделирования (без особых проблем).

Эрик Шефер
источник
-2

Предупреждение, использование пакетного файла для, токенов и разделителей при вводе неизвестного текста может привести к катастрофе из-за специальной интерпретации символов, таких как &,!, <И т. Д. Такие методы следует зарезервировать только для предсказуемого текста.

Пакетное предупреждение
источник