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.