Windows еквівалент команди "хвіст"


107

Чи є спосіб імітувати хвіст * nix у командному рядку Windows? У мене є файл, і я хочу спосіб відірвати перші п рядків тексту. Наприклад:

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відображаються лише перші п рядків, а не залишаються поза ними?
Джої

Будь ласка, Кріс розглянути нові відповіді з 2009 року, точніше відповідь Аміта Портноя . Оскільки ваше питання загальне, багато користувачів можуть знайти цю веб-сторінку. І вони можуть перестати читати відповіді вже після першого: відповіді, яку ви прийняли. Ви можете змінити прийняту відповідь на іншу, більш оновлену до теперішніх можливостей. Ура;)
олібре

Я розгублений. Оригінальне питання стосувалося headкоманди стилю Unix , але бажаний вихід виглядав так, як хочеться tail. Схоже, відповіді про те, headа ні tail.
blakeoft

@blakeoft оригінальне питання просило поведінку tail, однак заголовок сказавhead
ММ

Відповіді:


89

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

Підказка DOS:

C:\>more +2 myfile.txt

Наведена вище команда виведе все після перших 2 рядків.
Це насправді зворотна голова Unix :

Консоль Unix:

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

Наведена вище команда буде друкувати лише перші 2 рядки файлу.


8
Ні, це не те саме. tailпочинається підрахунок з кінця файлу. Отже, tail -2надрукуємо два останні рядки.
ADTC

5
Чи можу я також надрукувати перші п символів?
Qwerty

@ADTC (моя версія) хвіст не підтримує негативів. тільки голова робить (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

@blakeoft так, це так ... Я оновив свою відповідь. Дивно, що минуло 2 роки і 17 голосів, перш ніж хтось прокоментував це.
Аміт Портной

@blakeoft щойно зрозумів, що питання було відредаговано! (див. stackoverflow.com/posts/1295068/reitions). Спочатку просили головну команду ... оновлено, щоб включити обидві відповіді ...
Аміт Портной

2
@AmitPortnoy Я знайшов ще одну відповідь десь на цьому обміні стека, в якому говорилося, що зараз Get-Contentє команда хвоста. Наприклад, Get-content -Tail 5 file.txtбуде надруковано останні п'ять рядків file.txt. Дякуємо, що оновили свою відповідь btw.
blakeoft

2
будь-який спосіб використовувати його як фільтр? (наприклад, читання stdin замість файлу)
eadmaster

24
more /e filename.txt P n

де n = кількість рядків для відображення. Працює швидко і точно як headкоманда.


14
Команди, такі як P, S тощо, можуть бути введені користувачем лише під час запиту. Вони не можуть бути передані більш команді. Таким чином, приклад вище не працює
Філіберт Персе


12

Це тотальний злом, але якщо це величезний файл, який ви хочете просто вивчити формат, заголовок і т.д. швидко. Вихідні рядки неможливо точно контролювати, і ви, швидше за все, вб'єте його посередині рядка виводу, але це дешевий спосіб схопити невеликий шматочок інакше непридатного файлу.

Вих.

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" - це кількість рядків, які ви хочете надрукувати, а "ім'я файлу" - це ім'я файлу.


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

Використовуючи більше + n, про який вже згадував Метт, щоб уникнути пауз у довгих файлах, спробуйте це:

більше +1 myfile.txt> кон

Коли ви переспрямовуєте вихід з іншого, він не призупиняється - і тут ви перенаправляєте на консоль. Ви можете аналогічно перенаправити на інший файл, наприклад цей без пауз більше, якщо це бажаний кінцевий результат. Використовуйте>, щоб перенаправити файл та перезаписати його, якщо він вже існує, або >> для додавання до вже наявного файлу. (Можна використовувати для переадресації на згоду.)



5

Get-content -Tail n file.txt з повноваженнями - це єдине, що наближається tail Linux.

Get-Content *filename* | Select-Object -last *n*Запропоновано вище навантажень / синтаксичного цілого. Потрібно сказати, що він не був задоволений моїм файлом журналу 10 Гб ... Цей -Tailпараметр починається з кінця файлу.


2

Якщо ви хочете головну команду, один простий спосіб її отримати - це встановити Cygwin. Тоді у вас будуть всі інструменти UNIX.

Якщо це не вдале рішення, то можна спробувати скористатися findstr та здійснити пошук за індикатором кінця рядка.

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


2

Ось швидка командна головна голова, яка дає перші 9 рядків у DOS.

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

Перші 2 символи в кожному рядку будуть номером рядка.



2

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

Select -Last 1

Ця команда також може бути конвеєрною.

Приклад для отримання першого рядка:

type .\out.txt | Select -Last 1

або щоб отримати перший рядок:

 type .\out.txt | Select -First 1

1

FWIW, для тих, хто лише потребує відщеплення невизначеної кількості записів із заголовка файлу, більше> працює добре. Це корисно лише для того, щоб мати менший файл, з яким можна працювати на ранніх стадіях розробки чогось.


1

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

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

Оскільки більшість файлів містять пробіли, ця команда витягує кожен рядок з усіх файлів LOG і в основному їх нумерує, починаючи з 1 для кожного файлу. Нумеровані результати потім передаються у другу FINDкоманду, яка шукає рядок, позначений як номер 6.


1

На цій сторінці є безкоштовна headутиліта . Я ще цього не пробував.


1
Не впевнений, чому це було знято. Він виконується так само, як утиліта UNIX для голови.
козон

1
Це посилання для завантаження. Чи повинен він використати код двійкового файлу та вбудувати його у відповідь?
GargantuChet



-2

Я не думаю, що є вихід з коробки. У DOS такої команди немає, і пакетні файли далеко обмежені для її моделювання (без великих болів).


-2

Попередження, використання пакетного файлу для, лексем та обмежень на невідомому введенні тексту може стати катастрофою через особливу інтерпретацію символів типу &,!, <Тощо. Такі методи повинні бути зарезервовані лише для передбачуваного тексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.