Эквивалент 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

Ответы:


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


12

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

Ex.

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

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 символа в каждой строке будут номером строки.


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

1

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


1

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

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

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


1

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


1
Не уверен, почему это было отклонено. Она работает точно так же, как и утилита head UNIX.
coson

1
Это ссылка для скачивания. Должен ли он кодировать двоичный файл и вставлять его в ответ?
GargantuChet



-2

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


-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.