Powershell'de ne kafa, kuyruk, daha çok, daha az, nasıl yapılır? [kapalı]


110

Linux kullanıcısının eşdeğer komutları ne Powershell kullanarak pencereleri, üzerinde head, tail, more, lessve sed?


günlük dosyası çok büyük, yaklaşık birkaç MB. Notepad.exe ile görüntülemek çok zor.
Yue Zhang

Temeliniz olarak kullanıyorsanız notepad, alternatif metin editörlerine bakmanızı öneririm, bol miktarda (hem ücretsiz hem de ücretli) alternatif vardır. Hepsi not defterinden daha üstündür (her ne kadar bu bir zorluk olmasa da).
Richard


Büyük dosyalarla uğraşıyorum ve kullandığım diğer araçlardan çok daha hızlı olduğunu kanıtlayan Vim kullanıyorum / kuruyorum.
sfanjoy

Yanıtlar:


176

Get-Content(takma ad gc:) bir metin dosyasını okumak için her zamanki seçeneğinizdir. Daha sonra daha fazla filtre uygulayabilirsiniz:

gc log.txt | select -first 10 # head
gc -TotalCount 10 log.txt     # also head
gc log.txt | select -last 10  # tail
gc -Tail 10 log.txt           # also tail (since PSv3), also much faster than above option
gc log.txt | more             # or less if you have it installed
gc log.txt | %{ $_ -replace '\d+', '($0)' }         # sed

Bu, küçük dosyalar için yeterince iyi çalışır, daha büyük dosyalar (birkaç MiB'den fazla) muhtemelen biraz yavaştır.

PowerShell Topluluk Uzantıları uzman dosya şeyler (örneğin Al-FileTail) için bazı cmdlets sayılabilir.


3
Kutsal inek, bu işlemcimi -last 21GB CSV'de yapmak için maksimize ediyor. Sıcak içecek: ☕
mlissner

9
@mlissner: PowerShell v3'teyseniz Get-Content -Tail 2bunun yerine kullanabilirsiniz . Bu kesinlikle daha hızlı.
Joey

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sediçeriği geri koymadığı için bu aslında tam olarak sed aracı değildir. Set İçeriğine ihtiyacı var.
Artyom

3
@Neil, -Lastaynı sebepten dolayı awkyavaş aynı görev için yavaş olacaktır: Önce akışı tamamen tüketmesi gerekir. Bu yüzden Get-Content -Tailvar. Ve yok headçünkü adlandırma kurallarına uymuyor ve amacına zaten hizmet ediyor Select-Item.
Joey

3
@neil @joey Bir takma adı var -head. Cevabımı görün stackoverflow.com/a/41626586/1081043
wisbucky

53

Burada yerleşik yapmak için yollar vardır headve tail. Borular kullanmayın çünkü büyük bir dosyanız varsa, çok yavaş olacaktır. Bu yerleşik seçenekleri kullanmak, büyük dosyalar için bile son derece hızlı olacaktır.

gc log.txt -head 10 
gc log.txt -tail 10
gc log.txt -tail 10 -wait # equivalent to tail -f

ama Joey'nin yorumu tam tersini gösteriyor gibi görünüyor! Kime güveneceğimi veya hangi (yerleşik) yöntemin en verimli olduğunu nasıl bilebilirim?
NH.

2
@NH Cevabım Joey'nin yorumuyla uyumlu. Yorumunda "-Son yavaş ... Bu yüzden Get-Content -Tail var" diyor. | select -lastborular kullanır. Borusuz kullanıyorum -tail. Ancak, iki çelişkili cevap bulursanız, muhtemelen çok daha yüksek bir itibara sahip kişiye güvenebilirsiniz. Ayrıca, iki yöntemi büyük bir dosya üzerinde deneyebilirsiniz. Büyük bir dosyada çok açık olacaktır.
wisbucky

Anladım. Üzgünüm, yazıları ilk okuduğumda kafam karışmış olmalı.
NH.

8

more.exeWindows'ta bulunur, bağlantı noktaları lesskolayca bulunur (ve PowerShell Topluluk Uzantıları , PSCX, bir tane içerir).

PowerShell, her ikisi için de ayrı programlara gerçekten bir alternatif sağlamaz, ancak yapılandırılmış veriler Out-Gridiçin yardımcı olabilir.

Headve Tailher ikisi de sırasıyla ve parametreleri Select-Objectkullanılarak benzetilebilir .-First-Last

Sedişlevlerin tümü mevcuttur ancak oldukça farklı yapılandırılmıştır. Filtreleme seçenekleri Where-Object(veya üzerinden Foreach-Objectve aralıklar için bazı durumlarda) mevcuttur. Diğer, dönüştürme, işlemler Select-Objectve ile yapılabilir Foreach-Object.

Bununla birlikte, PowerShell (.NET) nesnelerini - tüm yazılı yapılarıyla, örn. tarihler DateTimeörnek olarak kalır - her komutun kendisini ayrıştırması gereken dizeler yerine, bu sedtür programların çoğu ve diğer programlar gereksizdir.


Parlak. gc, boru girişini desteklemiyor gibi görünüyor. bir komutun çıktısını filtrelemek istediğimde, "... exe ... | select-object -ilk 20 | select-object-last 1" kullanıyorum
A117

2

Bu durumda "-TotalCount" tam olarak "-head" gibi yanıt verir. Komutu bu şekilde çalıştırmak için -TotalCount veya -head kullanmanız gerekir. Ancak -TotalCount yanıltıcıdır - GERÇEKTEN çalışmaz ve size HERHANGİ bir sayı verir ...

gc -TotalCount 25 C:\scripts\logs\robocopy_report.txt

PS 5.1'de test edilen yukarıdaki komut dosyası, aşağıdaki gibi AYNI yanıttır ...

gc -head 25 C:\scripts\logs\robocopy_report.txt

Öyleyse zaten '-kafalı 25'i kullanın!


Merhaba @Patrick, Stack Overflow'a hoş geldiniz! Bu soruyu cevaplamaya çalıştığınız için teşekkür ederiz, lütfen daha ayrıntılı bir açıklama yapabilir misiniz? Bir çözüm sunmaya mı çalıştığınız yoksa sadece sorunla ilgili bazı yorumlar mı eklemeye çalıştığınız belli değil.
Rocío García Luque

Bu bir yorum ve aynı zamanda bir hayal kırıklığıydı. '-TotalCount "hiçbir şey yapmıyor" -Head "zaten yapmıyor. Peki, TotalCount'u nasıl alacağını bilen var mı?
Patrick Burwell

Tekrar okuyun ... Cevaba ekledim ve neyin işe yaradığını açıkladım ...
Patrick Burwell

1

Windows'ta büyük (veya küçük) günlük dosyalarını sorgulamanız gerekiyorsa, bulduğum en iyi araç Microsoft'un ücretsiz Günlük Ayrıştırıcısı 2.2'dir . İsterseniz onu PowerShell'den arayabilirsiniz ve tüm ağır işleri sizin için halledecektir ve çok hızlı bir şekilde.


yine de teşekkürler, ortamım Win2k8R2 ve Log Parser2.2
Yue Zhang

0

Daha iyi çözümlerim var:

gc log.txt -ReadCount 5 | %{$_;throw "pipeline end!"} # head
gc log.txt | %{$num=0;}{$num++;"$num $_"}             # cat -n
gc log.txt | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed

-1
$Push_Pop = $ErrorActionPreference #Suppresses errors
$ErrorActionPreference = SilentlyContinue #Suppresses errors
#Script
    #gc .\output\*.csv -ReadCount 5 | %{$_;throw "pipeline end!"} # head
    #gc .\output\*.csv | %{$num=0;}{$num++;"$num $_"}             # cat -n
    gc .\output\*.csv | %{$num=0;}{$num++; if($num -gt 2 -and $num -lt 7){"$num $_"}} # sed
#End Script 
$ErrorActionPreference = $Push_Pop #Suppresses errors

Pushpop kodu BTW ile tüm hataları almazsınız, kodunuz yalnızca "sed" seçeneği ile çalışır. Geri kalan her şey gc ve yol dışında hiçbir şeyi görmezden gelir.

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.