Windows'da bir komut çıkışının ilk N satırını nasıl görüntüleyebilirim? (Unix komutunun "head" eşdeğeri)


17

Unix headkomutunun eşdeğerine ihtiyacım var (çıkışın ilk N satırını göster). Şu anda kullandığım şey bu:

tasklist | find /N " " | findstr /r \[[0-9]\]

Yukarıdaki kod tasklistçıkışının ilk 10 satırını gösterir . regex kullanarak ilk 10 find /N " "satırı ayıklarken her satırın başına bir satır numarası ekler findstr /r \[[0-9]\].

Yukarıdaki kod çalışır, ancak herhangi bir aralık belirtmek gerekir . Windows'taki standartlara göre düzenli ifadelerin uygulanmadığı için çalışacak başka bir şey alamıyorum.

Bir cmd çıktısından keyfi satırları nasıl ayıklayabilirim? Bunu bir astarla yapmak önemlidir. Komut dosyası yok!


.....................
— giecsar

Yanıtlar:


36

Güç kalkanı.

PS C:\> netstat | Select -First 20

Düzenleme: Ben sadece 1989 dolaylarında cmd.exe kullanabilirsiniz, ancak bu doğru değil ısrar edecek bir duygu var. Powershell her işletim sistemi Vista + sürümüne eklenmiştir ve XP / 2003 üzerine yüklenebilir. Bu ise Windows'un geleceği.

Düzenleme: Tamam, istediğin gibi ol.

C:\> netstat -an > temp.txt && for /l %l in (1,1,10) do @for /f "tokens=1,2* delims=:" %a in ('findstr /n /r "^" temp.txt ^| findstr /r "^%l:"') do @echo %b

Netstat çıkışının ilk 10 satırını görüntüler.


5
PowerShell'in gelecek olduğuna şüphe yok, ama şimdi çalışan bir şeye ihtiyacım var. Kurumsal bir gerçeklikte, çoğu zaman teknik destek departmanımızın müşterilerinin hiçbiri Vista, 7 veya 8'e sahip olmayan yüzlerce Windows sunucusuna sahip değilim. hatta yetkili.
— giecsar

CMD.exe bu ...
— Ryan Ries

tek ihtiyaçları olan, bir powershell komutu çalıştırmak için oturum açabilecekleri bir w2k8r2 sunucusudur, bu mümkün mü?
— tony roth 28:13

2K8 sunucu olup olmadığını bilmiyorum, ama Ryan Ries'in cevabı tam olarak ihtiyacım olan şey. Çok teşekkür ederim Ryan!
— giecsar

1
Lütfen ... cevabı kabul edildi olarak işaretlemeyi unutmayın ...: `( köşede fetal pozisyonda kıvrılıyor ve kendi kendine ağlıyor
— Ryan Ries

8

Unix tipi biriyseniz , CygWin'i yüklemek size daha tanıdık bir ortam sağlar.


2
Hayır, netleştirdiğimi sanıyordum, ama hiçbir şey yükleyemiyorum. Windows komut işlemcisi (cmd.exe) ile çalışmalıdır. PowerShell yok, CygWin yok, komut dosyası yok.
— giecsar

3

" for" Döngüsünü kullanmaktan çok daha kolay olan kolay bir çözüm var .

Çıktıyı örnek olarak dir/o-d( dirtarihe göre ters sıralı) alalım.

Örneğin, 1'den 16'ya kadar olan satırları çıktılamak istiyorsanız, şunu kullanın:

dir/o-d|findstr/n ^^|findstr "^[1-9]: ^1[0-6]:"

Örneğin, 16 ila 45 arasındaki satırları çıkarmak istiyorsanız, şunu kullanın:

dir/o-d|findstr/n ^^|findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:"

Örnek çıktı:

16:08/08/2016  08:43 AM    <DIR>          nacl_sdk
17:11/05/2016  10:48 PM    <DIR>          3b 2
18:28/04/2016  02:47 PM    <DIR>          sample
19:22/04/2016  10:07 PM    <DIR>          mysql test
20:16/04/2016  01:22 AM    <DIR>          3b
21:16/04/2016  01:10 AM             2,706 errorlog
22:16/04/2016  12:53 AM                 0 accesslog
...

Yıkmak:

  1. İlk olarak, kullanarak tüm çıktı dökümü dir/o-d.

  2. Ardından, her satırı " $Num:"findstr/n ^^

    • ^satırın eşleşmesinin başlangıcı anlamına gelir ve ^^cmd içinde olduğumuz için kaçması gereken bir sürümdür.

    • Not: Bunun için kullanmanız gerekir, findstrçünkü find/n" "boşluk içermeyen çizgilerle eşleşmez.

  3. Son olarak, çıktıyı kullanarak kırpın findstr "^1[6-9]: ^[2-3][0-9]: ^4[0-5]:".

    • ^1[6-9]: 16 ila 19 arasında regex'tir.

    • ^[2-3][0-9]: 20 - 39 için regex'tir.

    • ^4[0-5]: 40 ila 45 ° C'dir.

    • findstr "a b c"araca ya eslestirilmeye dizeleri bulmak a, bya da c.

Ayrıca bkz. Https://stackoverflow.com/q/8844868/632951


Bu güzel bir çözüm, ama şimdi önek numarası var, son findstr çağrısında onlardan kurtulabilir mi?
— fschmitt

@fschmitt, findstrşeyleri kaldıramaz. Bu durumda bir döngü kullanmak zorunda kalacağınızı düşünüyorum.
— Pacerier

0

Bu tek satırlık bir komut, umarım sizin için de çalışır.

@echo off&cls&for /f "tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=1 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=2 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=3 tokens=*" %a in (Graph.bat) do echo %a&for /f "skip=4 tokens=*" %a in (Graph.bat) do echo %a&pause>nul

:: Run this from CMD.exe and make sure that your file is in your current working directory.

::Replace Graph.bat with your file.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.