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.