উইন্ডোজ পাওয়ারশেলে ইউনিক্স টেল সমতুল্য কমান্ড


349

আমাকে একটি বড় ফাইলের শেষ কয়েকটি লাইন দেখতে হবে (আদর্শ আকার 500MB-2GB)। আমি tailউইন্ডোজ পাওয়ারশেলের জন্য ইউনিক্স কমান্ডের সমতুল্য সন্ধান করছি । কয়েকটি বিকল্প উপলভ্য,

http://tailforwin32.sourceforge.net/

এবং

গেট-কনটেন্ট [ফাইলের নাম] | নির্বাচন-অবজেক্ট-সর্বশেষ 10

আমার জন্য এটি প্রথম বিকল্পটি ব্যবহার করার অনুমতি নেই এবং দ্বিতীয় বিকল্পটি ধীর গতিতে রয়েছে। পাওয়ারশেলের জন্য লেজের কার্যকর প্রয়োগ সম্পর্কে কেউ কি জানেন?


2
আপনি যদি প্রথম বিকল্পটি ব্যবহারের অনুমতি পাচ্ছেন না কেন আপনি যদি আমাদের পরামর্শটি ব্যবহার করেন তবে আপনাকে কীভাবে ব্যবহার করতে দেওয়া হবে তা আমরা কীভাবে জানতে পারি?
গাবে

3
সোর্সফোর্জ.নেট / প্রজেক্টস / ইউনিক্সিটিলস / ফাইলেস / ইউনিক্সিলস / সারেন্ট / এtail প্রদত্ত কমান্ডটি কোনও কারণে আপনি ব্যবহার করতে পারবেন না ?
গ্যাবে

1
এটি এমন একটি প্রোডাকশন মেশিনে রয়েছে যেখানে আমাকে কোনও বাহ্যিক এক্সিকিউটেবলের অনুলিপি করার অনুমতি দেওয়া হয়নি। কিছু অদ্ভুত নীতি। :) এটি সাহায্য করতে পারে না। আনক্সুটিলস লিঙ্কের জন্য ধন্যবাদ।
মিট্লাগন

https://devcentral.f5.com/blogs/us/unix-to-powershell- টেইল এটির বিশুদ্ধ PoSH বাস্তবায়ন দেখায়।
ইয়াভেগেনি

সিলেক্ট- Get-Content [filename] -last 10-tail
অবজেক্টটি

উত্তর:


491

-waitগেট-কনটেন্ট সহ প্যারামিটারটি ব্যবহার করুন , যা ফাইলগুলিতে যুক্ত হওয়ার সাথে সাথে লাইনগুলি প্রদর্শন করে। এই বৈশিষ্ট্যটি পাওয়ারশেল v1 এ উপস্থিত ছিল তবে কোনও কারণে v2-তে ভাল নথিভুক্ত করা হয়নি।

এখানে একটি উদাহরণ

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

একবার এটি চালানোর পরে, ফাইলটি আপডেট করুন এবং সংরক্ষণ করুন এবং আপনি কনসোলে পরিবর্তনগুলি দেখতে পাবেন।


16
মজাদার. আমি ভাবতাম যে সমস্ত যুক্তি উপস্থিত রয়েছে সেগুলি সাহায্যে উপস্থিত হয়, তবুও man gc -par waitআমাকে বলে যে কোনও পরামিতি নেই। তবে আমি মনে করি যে এটি ওপি-র সমস্যাটি সমাধান করে না, যেহেতু তারা চেয়েছিল tail, tail -fএবং একটি কার্যকর বাস্তবায়নও নয় । যেহেতু এটি শেষ লাইনগুলি ফিরিয়ে দেওয়ার আগে সম্পূর্ণ ফাইলটি পড়ে এটি তাদের প্রত্যাশা করা ফাইল আকারের জন্য বেদনাদায়ক।
জোয়

5
এফওয়াইআই, পিএসসিএক্সে গেট-ফাইলটেল (ওরফে লেজ) বাস্তবায়ন এটি করে। আপনি যদি কৌতূহলী হন তবে আপনি উত্স কোডটি দেখতে পারেন: pscx.codeplex.com/SourceControl/changeset/view/78514#1358075
কিথ হিল

7
@ জো-ওয়েইট একটি গতিশীল প্যারামিটার যা কেবলমাত্র ফাইলসিস্টেম সরবরাহকারীর জন্য প্রযোজ্য। জিসি যে কোনও সরবরাহকারীর জন্য ব্যবহার করা যেতে পারে যা সেই এপিআই প্রয়োগ করে। এগুলি আবিষ্কার করতে আমি ডকুমেন্টেশন ছাড়াও একমাত্র উপায় হ'ল (জিএমসি গেট-কনটেন্ট) ব্যবহার করা appropriate উপযুক্ত সরবরাহকারীর পথ থেকে প্যারামিটার। "জিসি" নামটি ব্যবহার করবেন না কারণ গতিশীল পরামিতিগুলি প্রদর্শিত হবে না।
জেসনমারচার

11
আমি জানি এটি কিছুক্ষণ আগে ছিল, তবে এর জন্য গেট-কনটেন্ট কাজ হওয়ার আগে ফাইলটি খোলার, সংযোজন, বন্ধ করার জন্য প্রক্রিয়া লেখার প্রয়োজন হয়। যদি লেখার প্রক্রিয়া ফাইলটি কখনও বন্ধ না করে তবে এটি কাজ করবে না যা লেজ -f এর ক্ষেত্রে নয়।
ডেভিড নিউকম্ব

15
অদ্ভুতভাবে, -আমি যখন কোনও উপায়ে লগ ফাইল অ্যাক্সেস করি তখনই ওয়েট আমাকে নতুন লাইন দেখায় (যেমন উইন্ডোজ এক্সপ্লোরার এ এটি নির্বাচন করা)। আমার ফাইলটিতে নতুন লাইনগুলি লিখিত হওয়ার সাথে সাথে লেজ আপডেটগুলি সরবরাহ করে। -উইটের সাহায্যে, ফাইলটি লিখিত হওয়ার সময় আমি কোনও পাওয়ারশেল উইন্ডো খুশি খুলে খুলে নতুন কোন লাইন না দেখিয়ে রাখতে পারি। যদি আমি তখন পপ-আপ হয়ে যাই এবং উইন্ডোজ এক্সপ্লোরার ফাইলটিতে ক্লিক করি, হঠাৎ পাওয়ারশেল "জেগে উঠল" এবং বাকী রেখাগুলি ধরে ফেলবে। এটি কি বাগ?
JoshL

196

সম্পূর্ণতার জন্য আমি উল্লেখ করব যে পাওয়ারশেল 3.0-এ এখন গেট-কনটেন্টে একটি টেইল পতাকা রয়েছে

Get-Content ./log.log -Tail 10

ফাইলের শেষ 10 লাইন পেয়েছে

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

ফাইলের শেষ 10 লাইন পেয়েছে এবং আরও অপেক্ষা করে

এছাড়াও, * নিক্স ব্যবহারকারীদের জন্য, লক্ষ্য করুন যে বেশিরভাগ সিস্টেমের ওরফে বিড়াল গেট-কনটেন্টে রয়েছে, সুতরাং এটি সাধারণত কাজ করে

cat ./log.log -Tail 10

@ লরালিপ্পারুলো কীভাবে এটি কাজ করে না? আমি অবশ্যই আগে এটি ব্যবহার করেছি।
জর্জ মাউয়ার

4
আমি কেবল এটি ব্যবহার করেছি এবং এটি এই ফর্ম্যাটে স্পট করেছেGet-Content .\test.txt -Wait -Tail 1
Coops

@ লৌরালিপাড়ুলো - আমার জন্যও কাজ করে:Get-Content -Path .\sync.log -Wait -Tail 10
এলিকা কোহেন

আইএসইতে, আমি যখন ($ সত্য) / ঘুমের সময় ব্যবহার করতাম এবং এটিতে স্যুইচ করতাম তবে এটি পুরো আইএসইটিকেও লক করে এবং অন্যান্য ট্যাবগুলিতে স্ক্রিপ্টগুলি চালাতে পারে না। আমি কি কেবল একটি নতুন আইএসই উদাহরণ শুরু করব?
তেওমন শিপাহি

@ তেমনশিপাহী কীভাবে -Waitপ্যারামিটারটি আপনার পক্ষে কার্যকর হয়নি ?
জর্জ

116

পাওয়ারশেল সংস্করণ ৩.০ হিসাবে, গেট-কন্টেন্ট সেমিডলেটটিতে একটি- টেল প্যারামিটার রয়েছে যা সহায়তা করা উচিত। গেট-কন্টেন্টের জন্য টেকনেট লাইব্রেরি অনলাইন সহায়তা দেখুন


1
এখানে ডাউনলোডের জন্য লিঙ্ক - মাইক্রোসফট /en-us/download/details.aspx?id=34595
গেড্রক্স

4
কারও কারও জন্য নোট - PS 3.0 উইন্ডোজ এক্সপি এবং ভিস্তার কাছে অনুপলব্ধ।
tjmoore

1
আমি ড্যান দ্বারা উল্লিখিত কৌশলটি ব্যবহার করি তবে আমি এটি আমার $ প্রোফাইলে রেকর্ড করি। এটিকে নোটপ্যাড $ প্রোফাইলে খুলুন। তারপরে পাঠ্য নথিতে একটি নতুন ফাংশন তৈরি করুন: ফাংশন টেইল ($ পাথ) {পান-সামগ্রী-টেইল 15-পথ $ পাথ-ওয়েইট each প্রতিবার আপনি পাওয়ারশেল শুরু করার সময় আপনি এই ক্রিয়ায় অ্যাক্সেস করতে পারবেন।
জেক নেলসন

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। - বর্তমানে গৃহীত উত্তরে উল্লিখিত ওয়েট পতাকা আর কাজ করে না।
আবদুল্লাহ লেগারি

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
২.০ সংস্করণটি 1GB সিএসভি ফাইলের 10 টি শেষ লাইনগুলি দেখানোর জন্য যুগে যুগে সময় নেয় এবং Get-Content [filename] | Select-Object -Last 10এটির থেকে
আলাদাভাবে

15

পূর্ববর্তী উত্তরগুলিতে কিছু সংযোজন। উদাহরণস্বরূপ আপনি পছন্দ করতে পারেন যদি আপনি ইউনিক্স ব্যবহার করা হয় পেতে-সামগ্রী জন্য সংজ্ঞায়িত alias লেখা হয় 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

পাওয়ারশেল ভি 2 এবং নীচে ব্যবহার করে, সামগ্রীটি পুরো ফাইলটি পড়ে, তাই এটি আমার কোনও উপকারে আসেনি। নিম্নলিখিত কোডটি আমার যা প্রয়োজন তার জন্য কাজ করে, যদিও চরিত্রের এনকোডিংগুলি নিয়ে কিছু সমস্যা রয়েছে। এটি কার্যকরভাবে টেইল-এফ, তবে লাইন ব্রেকগুলির জন্য পিছনের দিকে সন্ধান করতে চাইলে সর্বশেষ এক্স বাইটগুলি বা শেষ এক্স লাইনগুলি সহজেই সংশোধন করা যেতে পারে।

$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
এটি কি সত্য যে-টেল বিকল্প সহ গেট-সামগ্রী পুরো ফাইলটি পড়ে? বড় ফাইলগুলিতে এটি আমার কাছে ঠিক আছে।
Govert

আমি বিশ্বাস করি এটি পিএস সংস্করণের উপর নির্ভর করে। আমি উত্তর আপডেট করেছি। আমি কোনও কিছু ইনস্টল করার ক্ষমতা ছাড়াই একটি সার্ভারে আটকে ছিলাম, সুতরাং উপরের কোডটি কার্যকর ছিল।
হাজামি

3

আমি @ হাজামির সমাধান নিয়েছি এবং এটিকে কিছুটা সুবিধাজনক স্ক্রিপ্টের মোড়কে জড়িয়েছি।

আমি ফাইলটি শেষ হওয়ার আগে অফসেট থেকে শুরু করার জন্য একটি বিকল্প যুক্ত করেছি, যাতে আপনি ফাইলের শেষ থেকে নির্দিষ্ট পরিমাণে পড়ার লেজের মতো কার্যকারিতাটি ব্যবহার করতে পারেন। নোট করুন অফসেটটি বাইটে রয়েছে, লাইন নয়।

আরও কন্টেন্টের জন্য অপেক্ষা করা চালিয়ে যাওয়ার বিকল্প রয়েছে।

উদাহরণ (আপনি এটি টেলফিল.পিএস 1 হিসাবে সংরক্ষণ করেছেন ধরে নিচ্ছেন):

.\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

খুব বেসিক, তবে কোনও অ্যাডন মডিউল বা পিএস সংস্করণ প্রয়োজনীয়তা ছাড়াই আপনার যা প্রয়োজন তা করে:

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 }
কর্মসূচীটি

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
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.