पॉवर्सशेल में सिर, पूंछ, अधिक, कम, sed कैसे करें? [बन्द है]


109

खिड़कियां, PowerShell का उपयोग, बराबर आदेशों हैं क्या linux के लिए पर head, tail, more, lessऔर sed?


लॉग फ़ाइल बहुत बड़ी है, कई एमबीटी के बारे में। यह देखने के लिए notepad.exe द्वारा बहुत कठिन है।
यू झांग

यदि आप notepadअपने आधार के रूप में उपयोग कर रहे हैं, तो मैं वैकल्पिक पाठ संपादकों को देखने का सुझाव दूंगा, दोनों (मुक्त और भुगतान दोनों) विकल्प बहुत सारे हैं। सभी नोटपैड से बेहतर हैं (हालांकि यह बहुत ज्यादा चुनौती नहीं है)।
रिचर्ड


मैं बड़ी फ़ाइलों के साथ काम करता हूं और मैं विम का उपयोग / स्थापित करता हूं जो मेरे द्वारा उपयोग किए गए किसी भी अन्य टूल की तुलना में बहुत तेज साबित होता है।
19

जवाबों:


174

Get-Content(उपनाम:) gcपाठ फ़ाइल पढ़ने के लिए आपका सामान्य विकल्प है। फिर आप आगे फ़िल्टर कर सकते हैं:

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

यह छोटी फ़ाइलों के लिए पर्याप्त रूप से काम करता है, बड़े वाले (कुछ MiB से अधिक) शायद थोड़ा धीमा हैं।

PowerShell समुदाय एक्सटेंशन विशेष फ़ाइल सामान (जैसे प्राप्त करें-FileTail) के लिए कुछ cmdlets शामिल हैं।


3
पवित्र गाय, यह -last 21 जीबी सीएसवी पर करने के लिए मेरे सीपीयू को अधिकतम कर रहा है । गर्म पेय: beverage
mlissner

9
@mlissner: यदि आप PowerShell v3 पर हैं, तो आप Get-Content -Tail 2इसके बजाय उपयोग कर सकते हैं । वह निश्चित रूप से तेज है।
जॉय

gc log.txt | %{ $_ -replace '\d+', '($0)' } # sedयह वास्तव में पूरी तरह से sed उपकरण नहीं है क्योंकि यह सामग्री वापस नहीं डालता है। इसके लिए सेट-कंटेंट चाहिए।
अर्टोम

3
@ नील, -Lastएक awkही कार्य के लिए धीमा होगा उसी कारण से धीमा है: इसे पहले पूरी तरह से स्ट्रीम का उपभोग करना होगा। इसलिए Get-Content -Tailमौजूद है। और कोई भी headकारण नहीं है कि यह नामकरण सम्मेलनों में फिट नहीं होता है, और इसका उद्देश्य पहले से ही है Select-Item
जोए

3
@neil @joey उनके लिए एक उपनाम है -head। मेरा उत्तर देखें stackoverflow.com/a/41626586/1081043
बुद्धिमानबांकी

52

यहाँ करने के लिए headऔर निर्मित तरीके हैं tail। पाइप का उपयोग न करें क्योंकि यदि आपके पास एक बड़ी फ़ाइल है, तो यह बेहद धीमी होगी। इन विकल्पों का उपयोग करना बहुत बड़ी फ़ाइलों के लिए भी बहुत तेज़ होगा।

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

लेकिन जॉय की टिप्पणी इसके ठीक उलट संकेत देती है! मुझे कैसे पता चलेगा कि किस पर भरोसा किया जाए या कौन सा (बिल्ट-इन) तरीका सबसे कारगर है?
एनएच।

2
@ एनएच मेरा जवाब जॉय की टिप्पणी के साथ है। उनकी टिप्पणी कहती है "-लस्ट स्लो है ... इसीलिए गेट-कंटेंट-टेल इज मौजूद है।" | select -lastपाइप का उपयोग करता है। मैं -tailपाइप के बिना उपयोग कर रहा हूँ । लेकिन अगर आपको कभी दो परस्पर विरोधी उत्तर मिलते हैं, तो आप शायद बहुत अधिक प्रतिष्ठा वाले व्यक्ति पर भरोसा कर सकते हैं। इसके अलावा, आप बस एक बड़े फ़ाइल पर दो तरीकों की कोशिश कर सकते हैं। यह एक बड़ी फ़ाइल पर बहुत स्पष्ट होगा।
समझदार

समझ गया। क्षमा करें, मैं पहली बार पोस्ट पढ़ने के बाद भ्रमित हो गया हूँ।
एनएच।

8

more.exeविंडोज पर मौजूद हैं, पोर्ट lessआसानी से मिल जाते हैं (और पॉवरशेल कम्युनिटी एक्सटेंशन्स , PSCX, एक शामिल हैं)।

PowerShell वास्तव में या तो अलग-अलग कार्यक्रमों के लिए कोई विकल्प प्रदान नहीं करता है, लेकिन संरचित डेटा के Out-Gridलिए सहायक हो सकता है।

Headऔर Tailदोनों क्रमशः और मापदंडों Select-Objectका उपयोग करके अनुकरण किया जा सकता है।-First-Last

Sedफ़ंक्शन सभी उपलब्ध हैं, लेकिन अलग-अलग तरीके से संरचित हैं। फ़िल्टरिंग विकल्प Where-Object(या Foreach-Objectरेंज के लिए और कुछ राज्य) में उपलब्ध हैं। अन्य, रूपांतरित, संचालन Select-Objectऔर के साथ किया जा सकता है Foreach-Object

हालाँकि, PowerShell पास (.NET) ऑब्जेक्ट के रूप में - उनकी सभी टाइप की गई संरचना के साथ, जैसे। तारीखें DateTimeउदाहरण हैं - केवल तार के बजाय, जिसे प्रत्येक कमांड को स्वयं को पार्स करने की आवश्यकता है, sedइस तरह के अधिकांश और अन्य कार्यक्रम बेमानी हैं।


प्रतिभाशाली। जीसी पाइप इनपुट का समर्थन नहीं करता है। जब मैं एक कमांड के आउटपुट को फ़िल्टर करना चाहता हूं, तो मैं "... exe ... | select-object -first 20 का उपयोग कर रहा हूं। select-object -last 1"
A117

2

इस उदाहरण में "-TotalCount" बिल्कुल "-हेड" की तरह प्रतिक्रिया करता है। आपको कमांड को चलाने के लिए -TotalCount या -head का उपयोग करना होगा। लेकिन -TotalCount भ्रामक है - यह वास्तव में आपके किसी भी मायने देने पर काम नहीं करता है ...

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

उपरोक्त स्क्रिप्ट, पीएस 5.1 में परीक्षण नीचे के रूप में एक ही प्रतिक्रिया है ...

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

तो फिर पहले से ही 'सिर 25' का उपयोग करें!


हाय @ पैट्रिक, स्टैक ओवरफ्लो में आपका स्वागत है! इस प्रश्न का उत्तर देने के लिए धन्यवाद, क्या आप कृपया अधिक विस्तृत विवरण प्रदान कर सकते हैं? यह स्पष्ट नहीं है कि क्या आप किसी समाधान की पेशकश करने की कोशिश कर रहे हैं या समस्या के बारे में कुछ टिप्पणी जोड़ना चाहते हैं।
रोसीओ गार्सिया लुके

यह एक टिप्पणी थी और एक हताशा भी। '-TotalCount "कुछ भी नहीं करता है" -हेड "पहले से ही नहीं करता है। तो क्या कोई नहीं जानता है कि TotalCount कैसे प्राप्त करें?
पैट्रिक

इसे फिर से पढ़ें ... मैंने जवाब में जोड़ा और स्पष्ट किया कि क्या काम करता है ...
पैट्रिक बर्वेल

1

यदि आपको विंडोज पर बड़ी (या छोटी) लॉग फ़ाइलों को क्वेरी करने की आवश्यकता है, तो मुझे जो सबसे अच्छा उपकरण मिला है वह माइक्रोसॉफ्ट का मुफ्त लॉग पार्सर 2.2 है । आप चाहें तो इसे PowerShell से कॉल कर सकते हैं और यह आपके लिए सभी भारी लिफ्टिंग करेगा, और बहुत तेज़ भी।


वैसे भी, मेरा वातावरण Win2k8R2 है जो लॉग Parser2.2 की सिस्टम आवश्यकताओं में नहीं है
यू झांग

0

मुझे कुछ बेहतर उपाय मिले:

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

आपको पुशपॉप कोड BTW के साथ सभी त्रुटियां नहीं मिलती हैं, आपका कोड केवल "sed" विकल्प के साथ काम करता है। बाकी सभी कुछ भी अनदेखा कर देते हैं लेकिन gc और पथ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.