विंडोज पॉवर्सशेल में यूनिक्स पूंछ बराबर कमांड


350

मुझे एक बड़ी फ़ाइल की अंतिम कुछ पंक्तियों को देखना है (विशिष्ट आकार 500 एमबी -2 जीबी है)। मैं tailविंडोज पॉवर्सशेल के लिए यूनिक्स कमांड के बराबर की तलाश कर रहा हूं । कुछ विकल्प उपलब्ध हैं,

http://tailforwin32.sourceforge.net/

तथा

Get-Content [फ़ाइल नाम] | Select-Object -Last 10

मेरे लिए, इसे पहले विकल्प का उपयोग करने की अनुमति नहीं है, और दूसरा विकल्प धीमा है। क्या किसी को PowerShell के लिए पूंछ के कुशल कार्यान्वयन का पता है।


2
हम कैसे जान सकते हैं कि क्या आपको वह उपयोग करने की अनुमति होगी जो हम सुझाते हैं यदि आप नहीं कहते हैं कि आपको पहले विकल्प का उपयोग करने की अनुमति क्यों नहीं है?
गाबे

3
किसी भी कारण से आप sourceforge.net/projects/unxutils/files/unxutils/current/…tail में दी गई कमांड का उपयोग नहीं कर सकते हैं ?
गेबे

1
यह एक उत्पादन मशीन में है, जहां मुझे किसी भी बाहरी निष्पादन की प्रतिलिपि बनाने की अनुमति नहीं थी। कुछ अजीब नीतियां। :) यह मदद नहीं कर सकता। Unxutils लिंक के लिए धन्यवाद।
म्यूटेलोगन

https://devcentral.f5.com/blogs/us/unix-to-powershell-tail इस के शुद्ध PoSH कार्यान्वयन को प्रदर्शित करता है।
येवगेनी

: का चयन करें-वस्तु का उपयोग करने की आवश्यकता नहीं है Get-Content [filename] -last 10और जोड़ने -tail-f के लिए
MortenB

जवाबों:


492

-waitगेट-कंटेंट के साथ पैरामीटर का उपयोग करें , जो फ़ाइल में जोड़े जाने पर लाइनों को प्रदर्शित करता है। यह सुविधा PowerShell v1 में मौजूद थी, लेकिन किसी कारण से v2 में अच्छी तरह से प्रलेखित नहीं हुई।

यहाँ एक उदाहरण है

Get-Content -Path "C:\scripts\test.txt" -Wait

एक बार जब आप इसे चलाते हैं, तो फ़ाइल को अपडेट करें और सेव करें और आप कंसोल पर बदलाव देखेंगे।


16
दिलचस्प। मुझे लगता है कि सभी तर्क मौजूद हैं जो मदद में भी दिखाई देते हैं, फिर भी man gc -par waitमुझे बताता है कि कोई पैरामीटर नहीं है। लेकिन मुझे लगता है कि यह ओपी के पास उस समस्या को हल नहीं करता है, क्योंकि उन्होंने इसके लिए कहा tail, न कि tail -fएक कुशल कार्यान्वयन। चूँकि यह अंतिम पंक्तियों को वापस करने से पहले पूरी फ़ाइल को पढ़ता है इसलिए यह उन फ़ाइल आकारों के लिए दर्दनाक होता है जिनकी वे अपेक्षा करते हैं।
जॉय

5
FYI करें, यह वही है जो Get-FileTail (उपनाम पूंछ) कार्यान्वयन PSCX में करता है। यदि आप उत्सुक हैं तो आप सोर्स कोड देख सकते हैं: pscx.codeplex.com/SourceControl/changeset/view/78514#1358075
कीथ हिल

7
@ जोइ -वेट एक डायनेमिक पैरामीटर है जो केवल फाइलसिस्टम प्रदाता पर लागू होता है। जीसी का उपयोग किसी भी प्रदाता पर किया जा सकता है जो एपीआई को लागू करता है। प्रलेखन के अलावा एकमात्र तरीका जो मुझे पता है कि इन का उपयोग करना है (gcm Get-Content) का उपयोग करें। उपयुक्त प्रदाता पथ के भीतर पैरामीटर। उपनाम "gc" का उपयोग न करें क्योंकि गतिशील पैरामीटर दिखाई नहीं देंगे।
जेसनमाकर

11
मुझे पता है कि यह कुछ समय पहले था, लेकिन इसके लिए फाइल को खोलने, जोड़ने, काम करने से पहले प्रक्रिया को लिखना आवश्यक है। यदि लेखन प्रक्रिया कभी फ़ाइल बंद नहीं करती है, तो यह काम नहीं करेगा जो पूंछ -f के साथ ऐसा नहीं है।
डेविड न्यूकॉम

15
अजीब तरह से, केवल मुझे नई लाइनें दिखाई देती हैं जब मैं किसी तरह से लॉग फ़ाइल तक पहुंचता हूं (जैसे कि विंडोज एक्सप्लोरर में इसे चुनना)। पूंछ अपडेट प्रदान करती है क्योंकि नई लाइनें मेरी फ़ाइल में लिखी गई हैं। के साथ-साथ, मैं फ़ाइल को लिखे जाने के दौरान कोई नई लाइनें नहीं दिखाते हुए खुशी से PowerShell विंडो खोल सकता हूं। यदि मैं तब पॉप करता हूं और विंडोज एक्सप्लोरर में फाइल पर क्लिक करता हूं, तो अचानक PowerShell "उठता है" और शेष लाइनों को पकड़ता है। क्या यह एक बग है?
जोशेल

199

पूर्णता के लिए मैं उल्लेख करूंगा कि पॉवर्सशेल 3.0 में अब गेट-कंटेंट पर एक ध्वज है

Get-Content ./log.log -Tail 10

फ़ाइल की अंतिम 10 पंक्तियाँ प्राप्त करता है

Get-Content ./log.log -Wait -Tail 10

फ़ाइल की अंतिम 10 पंक्तियाँ प्राप्त करता है और अधिक प्रतीक्षा करता है

इसके अलावा, उन * निक्स उपयोगकर्ताओं के लिए, ध्यान दें कि अधिकांश सिस्टम उर्फ कैट को गेट-कंटेंट के लिए देते हैं, इसलिए यह आमतौर पर काम करता है

cat ./log.log -Tail 10

@LauraLiparulo किस तरीके से काम नहीं करता है? मैंने निश्चित रूप से पहले इसका इस्तेमाल किया है।
जॉर्ज मौयर

4
मैंने सिर्फ इसका इस्तेमाल किया और इसने इस फॉर्मेट में काम कियाGet-Content .\test.txt -Wait -Tail 1
कूपर

@LauraLiparulo - मेरे लिए भी काम करता है:Get-Content -Path .\sync.log -Wait -Tail 10
elika kohen

आईएसई पर, मैं ($ सच) / नींद का उपयोग करता था और इस पर स्विच करता था, लेकिन यह भी पूरे आईएसई को बंद कर देता है और अन्य टैब पर स्क्रिप्ट नहीं चला सकता है। क्या मुझे बस एक नया ISE उदाहरण शुरू करना चाहिए?
तेमन शिपाही

@Teomanshipahi किस तरह से -Waitपैरामीटर ने आपके लिए काम नहीं किया?
जॉर्ज मौअर

116

PowerShell संस्करण 3.0 के रूप में, Get-Content cmdlet में एक -Tail पैरामीटर है जिसकी मदद करनी चाहिए। Get-Content के लिए ऑनलाइन तकनीकी लाइब्रेरी देखें


1
यहां डाउनलोड करने के लिए लिंक - microsoft.com/en-us/download/details.aspx?id=34595
गेद्रोक्स

4
कुछ के लिए ध्यान दें - PS 3.0 विंडोज एक्सपी और विस्टा के लिए अनुपलब्ध है।
tjmoore

1
मैं डैन द्वारा बताई गई तकनीक का उपयोग करता हूं लेकिन मैं इसे अपने $ शख्सियत में दर्ज करता हूं। नोटपैड $ प्रोफ़ाइल के साथ इसे खोलें। फिर टेक्स्ट डॉक्यूमेंट में, एक नया फंक्शन बनाएं: फंक्शन टेल ($ path) {Get-content -atel -path $ path -wait} इस तरह से आप हर बार पावरशेल शुरू करने पर फंक्शन को एक्सेस कर सकते हैं।
जेक नेल्सन

यह स्वीकृत उत्तर होना चाहिए। वर्तमान में स्वीकार किए गए उत्तर में उल्लिखित ध्वज अब काम नहीं करता है।
अब्दुल्ला लेघरी

21

मैंने यहाँ दिए गए कुछ जवाबों का इस्तेमाल किया, लेकिन सिर्फ एक सिर

Get-Content -Path Yourfile.log -Tail 30 -Wait 

थोड़ी देर बाद स्मृति चबा जाएगा। एक सहकर्मी ने आखिरी दिन में इस तरह की "पूंछ" को छोड़ दिया और यह 800 एमबी तक बढ़ गया। मुझे नहीं पता कि यूनिक्स पूंछ उसी तरह व्यवहार करती है (लेकिन मुझे संदेह है)। तो यह अल्पावधि अनुप्रयोगों के लिए उपयोग करने के लिए ठीक है, लेकिन इसके साथ सावधान रहें।


18

PowerShell सामुदायिक एक्सटेंशन (PSCX) Get-FileTailcmdlet प्रदान करता है । यह कार्य के लिए एक उपयुक्त समाधान की तरह दिखता है। नोट: मैंने इसे बहुत बड़ी फ़ाइलों के साथ आज़माया नहीं था, लेकिन वर्णन कहता है कि यह कुशलता से सामग्री को पूंछता है और इसे बड़ी लॉग फ़ाइलों के लिए डिज़ाइन किया गया है।

NAME
    Get-FileTail

SYNOPSIS
    PSCX Cmdlet: Tails the contents of a file - optionally waiting on new content.

SYNTAX
    Get-FileTail [-Path] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]

    Get-FileTail [-LiteralPath] <String[]> [-Count <Int32>] [-Encoding <EncodingParameter>] [-LineTerminator <String>] [-Wait] [<CommonParameters>]

DESCRIPTION
    This implentation efficiently tails the cotents of a file by reading lines from the end rather then processing the entire file. This behavior is crucial for ef
    ficiently tailing large log files and large log files over a network.  You can also specify the Wait parameter to have the cmdlet wait and display new content
    as it is written to the file.  Use Ctrl+C to break out of the wait loop.  Note that if an encoding is not specified, the cmdlet will attempt to auto-detect the
     encoding by reading the first character from the file. If no character haven't been written to the file yet, the cmdlet will default to using Unicode encoding
    . You can override this behavior by explicitly specifying the encoding via the Encoding parameter.

1
वर्तमान संस्करण में एक बग है जो दैनिक बिट्स में तय किया गया है। मैं नवीनतम बिट्स को हथियाने और उन्हें कम से कम तब तक संकलित करने की सलाह दूंगा जब तक कि हमें एक अद्यतन संस्करण जारी नहीं किया जाता।
कीथ हिल

7
संस्करण 2.0 को 1 जीबी सीएसवी फ़ाइल की 10 अंतिम पंक्तियों को दिखाने के लिए उम्र लगती है, और इससे अलग Get-Content [filename] | Select-Object -Last 10नहीं हो सकता है
जादर डायस

15

पिछले जवाबों के लिए बस कुछ जोड़। वहाँ गेट-कंटेंट के लिए एलिफ़ायड परिभाषित हैं, उदाहरण के लिए यदि आप यूनिक्स के लिए उपयोग किए जाते हैं जो आपको पसंद हो सकता है cat, और वहाँ भी हैं typeऔर gc। इसलिए इसके बजाय

Get-Content -Path <Path> -Wait -Tail 10

तुम लिख सकते हो

# Print whole file and wait for appended lines and print them
cat <Path> -Wait
# Print last 10 lines and wait for appended lines and print them
cat <Path> -Tail 10 -Wait

3

Powershell V2 और नीचे का उपयोग करते हुए, गेट-कंटेंट पूरी फाइल को पढ़ता है, इसलिए यह मेरे लिए किसी काम का नहीं था। निम्नलिखित कोड मेरे लिए आवश्यक काम करता है, हालांकि चरित्र एन्कोडिंग के साथ कुछ मुद्दों की संभावना है। यह प्रभावी रूप से टेल-ऑफ़ है, लेकिन यदि आप लाइन ब्रेक के लिए पीछे की ओर खोजना चाहते हैं, तो इसे अंतिम एक्स बाइट्स, या अंतिम एक्स लाइनों को आसानी से संशोधित किया जा सकता है।

$filename = "\wherever\your\file\is.txt"
$reader = new-object System.IO.StreamReader(New-Object IO.FileStream($filename, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
#start at the end of the file
$lastMaxOffset = $reader.BaseStream.Length

while ($true)
{
    Start-Sleep -m 100

    #if the file size has not changed, idle
    if ($reader.BaseStream.Length -eq $lastMaxOffset) {
        continue;
    }

    #seek to the last max offset
    $reader.BaseStream.Seek($lastMaxOffset, [System.IO.SeekOrigin]::Begin) | out-null

    #read out of the file until the EOF
    $line = ""
    while (($line = $reader.ReadLine()) -ne $null) {
        write-output $line
    }

    #update the last max offset
    $lastMaxOffset = $reader.BaseStream.Position
}

मैं यह करने के कोड से ज्यादातर पाया यहाँ


1
क्या यह सही है कि गेट-सामग्री के साथ -Tail विकल्प पूरी फ़ाइल को पढ़ता है? बड़ी फ़ाइलों पर यह मेरे लिए ठीक लगता है।
शासी

मेरा मानना ​​है कि यह PS संस्करण पर निर्भर करता है। मैंने जवाब अपडेट कर दिया है। मैं उस समय कुछ भी स्थापित करने की क्षमता के बिना एक सर्वर पर अटक गया था, इसलिए उपरोक्त कोड उपयोगी था।
हजामी

3

मैंने @ hajamie का समाधान लिया और इसे थोड़ा अधिक सुविधाजनक स्क्रिप्ट आवरण में लपेट दिया।

मैंने फ़ाइल के अंत से पहले एक ऑफसेट से शुरू करने का विकल्प जोड़ा, ताकि आप फ़ाइल के अंत से एक निश्चित राशि को पढ़ने की पूंछ जैसी कार्यक्षमता का उपयोग कर सकें। नोट ऑफसेट बाइट्स में है, रेखाएं नहीं।

अधिक सामग्री की प्रतीक्षा जारी रखने का एक विकल्प भी है।

उदाहरण (मान लें कि आप इसे TailFile.ps1 के रूप में सहेजते हैं):

.\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000
.\TailFile.ps1 -File .\path\to\myfile.log -InitialOffset 1000000 -Follow:$true
.\TailFile.ps1 -File .\path\to\myfile.log -Follow:$true

और यहाँ स्क्रिप्ट ही है ...

param (
    [Parameter(Mandatory=$true,HelpMessage="Enter the path to a file to tail")][string]$File = "",
    [Parameter(Mandatory=$true,HelpMessage="Enter the number of bytes from the end of the file")][int]$InitialOffset = 10248,
    [Parameter(Mandatory=$false,HelpMessage="Continuing monitoring the file for new additions?")][boolean]$Follow = $false
)

$ci = get-childitem $File
$fullName = $ci.FullName

$reader = new-object System.IO.StreamReader(New-Object IO.FileStream($fullName, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [IO.FileShare]::ReadWrite))
#start at the end of the file
$lastMaxOffset = $reader.BaseStream.Length - $InitialOffset

while ($true)
{
    #if the file size has not changed, idle
    if ($reader.BaseStream.Length -ge $lastMaxOffset) {
        #seek to the last max offset
        $reader.BaseStream.Seek($lastMaxOffset, [System.IO.SeekOrigin]::Begin) | out-null

        #read out of the file until the EOF
        $line = ""
        while (($line = $reader.ReadLine()) -ne $null) {
            write-output $line
        }

        #update the last max offset
        $lastMaxOffset = $reader.BaseStream.Position
    }

    if($Follow){
        Start-Sleep -m 100
    } else {
        break;
    }
}


0

बहुत बुनियादी है, लेकिन क्या आप किसी भी addon मॉड्यूल या PS संस्करण आवश्यकताओं के बिना की जरूरत है:

while ($true) {Clear-Host; gc E:\test.txt | select -last 3; sleep 2 }


4
यह बड़ी फ़ाइलों पर क्रूर है।
पेकोस बिल

मेरा काम था: while($true) { Clear-Host; Get-Content <filename> -tail 40; sleep 1 }:)
NoLifeKing

0

शायद एक उत्तरदाता के लिए बहुत देर हो चुकी है लेकिन, इसे आज़माएं

Get-Content <filename> -tail <number of items wanted>

0

हालांकि, कई वैध जवाब हैं, उनमें से कोई भी नहीं है लिनक्स में पूंछ समान सिंटैक्स नहीं है । निम्नलिखित फ़ंक्शन को आपके $Home\Documents\PowerShell\Microsoft.PowerShell_profile.ps1द्वारा दृढ़ता के लिए संग्रहीत किया जा सकता है ( अधिक विवरण के लिए शक्तियां प्रोफाइल प्रलेखन देखें)।

यह आपको कॉल करने की अनुमति देता है ...

tail server.log
tail -n 5 server.log
tail -f server.log
tail -Follow -Lines 5 -Path server.log

जो लिनक्स सिंटैक्स के काफी करीब आता है।

function tail {
<#
    .SYNOPSIS
        Get the last n lines of a text file.
    .PARAMETER Follow
        output appended data as the file grows
    .PARAMETER Lines
        output the last N lines (default: 10)
    .PARAMETER Path
        path to the text file
    .INPUTS
        System.Int
        IO.FileInfo
    .OUTPUTS
        System.String
    .EXAMPLE
        PS> tail c:\server.log
    .EXAMPLE
        PS> tail -f -n 20 c:\server.log
#>
    [CmdletBinding()]
    [OutputType('System.String')]
    Param(
        [Alias("f")]
        [parameter(Mandatory=$false)]
        [switch]$Follow,

        [Alias("n")]
        [parameter(Mandatory=$false)]
        [Int]$Lines = 10,

        [parameter(Mandatory=$true, Position=5)]
        [ValidateNotNullOrEmpty()]
        [IO.FileInfo]$Path
    )
    if ($Follow)
    {
        Get-Content -Path $Path -Tail $Lines -Wait
    }
    else
    {
        Get-Content -Path $Path -Tail $Lines
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.