linux - फ़ाइल के बीच में विशिष्ट लाइनों को प्रदर्शित करने के लिए त्वरित यूनिक्स कमांड?




bash unix (12)

Sklivvz 'उत्तर पर बिल्डिंग, यहां एक अच्छा फ़ंक्शन है .bash_aliases कोई .bash_aliases फ़ाइल में डाल सकता है। फाइल के सामने से सामान प्रिंट करते समय यह बड़ी फाइलों पर कुशल है।

function middle()
{
    startidx=$1
    len=$2
    endidx=$(($startidx+$len))
    filename=$3

    awk "FNR>=${startidx} && FNR<=${endidx} { print NR\" \"\$0 }; FNR>${endidx} { print \"END HERE\"; exit }" $filename
}

किसी सर्वर के साथ किसी समस्या को डीबग करने का प्रयास करना और मेरी एकमात्र लॉग फ़ाइल एक 20 जीबी लॉग फ़ाइल है (बिना टाइमस्टैम्प के! भी लोग लॉगिंग के रूप में System.out.println() उपयोग क्यों करते हैं? उत्पादन में ?!)

Grep का उपयोग करके, मुझे उस फ़ाइल का एक क्षेत्र मिला है जिसे मैं 347340107 लाइन पर देखना चाहता हूं।

कुछ ऐसा करने के अलावा

head -<$LINENUM + 10> filename | tail -20 

... जिसके लिए लॉग फ़ाइल की पहली 347 मिलियन लाइनों के माध्यम से पढ़ने की आवश्यकता होगी, क्या एक त्वरित और आसान कमांड है जो कंसोल पर 347340100 - 347340200 (उदाहरण के लिए) लाइनों को डंप करेगा?

अद्यतन मैं पूरी तरह से भूल गया कि grep एक मैच के आसपास संदर्भ मुद्रित कर सकते हैं ... यह अच्छी तरह से काम करता है। धन्यवाद!


आप ex कमांड का उपयोग कर सकते हैं, एक मानक यूनिक्स संपादक (अब विम का हिस्सा), उदाहरण के लिए

  • एक लाइन प्रदर्शित करें (उदाहरण के लिए दूसरा एक):

    ex +2p -scq file.txt
    

    संबंधित sed वाक्यविन्यास: sed -n '2p' file.txt

  • रेखाओं की रेंज (जैसे 2-5 लाइनें):

    ex +2,5p -scq file.txt
    

    sed वाक्यविन्यास: sed -n '2,5p' file.txt

  • दिए गए लाइन से अंत तक (उदाहरण के लिए फ़ाइल के अंत तक 5 वां):

    ex +5,p -scq file.txt
    

    sed वाक्यविन्यास: sed -n '2,$p' file.txt

  • एकाधिक रेखा श्रेणियां (जैसे 2-4 और 6-8 लाइनें):

    ex +2,4p +6,8p -scq file.txt
    

    sed वाक्यविन्यास: sed -n '2,4p;6,8p' file.txt

उपरोक्त आदेशों का परीक्षण निम्न परीक्षण फ़ाइल के साथ किया जा सकता है:

seq 1 20 > file.txt

स्पष्टीकरण:

  • आदेश के बाद + या -c - फ़ाइल पढ़ने के बाद (vi / vim) कमांड निष्पादित करें,
  • -s - मूक मोड, वर्तमान टर्मिनल को डिफ़ॉल्ट आउटपुट के रूप में भी उपयोग करता है,
  • q बाद -c संपादक छोड़ने का आदेश है (जोड़ें ! बल छोड़ने के लिए, उदाहरण के लिए -scq! )।

उपयोग

x=`cat -n <file> | grep <match> | awk '{print $1}'`

यहां आपको लाइन नंबर मिलेगा जहां मैच हुआ था।

अब आप 100 लाइनों को मुद्रित करने के लिए निम्न आदेश का उपयोग कर सकते हैं

awk -v var="$x" 'NR>=var && NR<=var+100{print}' <file>

या आप "sed" का भी उपयोग कर सकते हैं

sed -n "${x},${x+100}p" <file>

एक प्राप्त करें

एएसी - लाइन = स्टार्ट-एंड फ़ाइल नाम


नहीं, फाइलें लाइन-एड्रेसेबल नहीं हैं।

टेक्स्ट फ़ाइल में लाइन एन की शुरुआत को खोजने के लिए कोई निरंतर समय नहीं है। आपको फ़ाइल के माध्यम से स्ट्रीम करना होगा और न्यूलाइन की गिनती करनी होगी।

नौकरी करने के लिए आपको सबसे सरल / तेज़ टूल का उपयोग करें। मेरे लिए, head का उपयोग grep तुलना में अधिक समझ में आता है, क्योंकि बाद वाला तरीका अधिक जटिल है। मैं यह नहीं कह रहा हूं कि " grep धीमा है", यह वास्तव में नहीं है, लेकिन अगर मैं इस मामले के लिए head से तेज़ हूं तो मुझे आश्चर्य होगा। वह मूल रूप से head में एक बग होगा।


पर्ल के साथ आसान! यदि आप फ़ाइल से लाइन 1, 3 और 5 प्राप्त करना चाहते हैं, तो / etc / passwd कहें:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd

मैं पहले फ़ाइल को इस तरह के कुछ छोटे भागों में विभाजित करता हूं

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix

और फिर परिणामस्वरूप फ़ाइलों पर grep।


मैं बस less में जाना पसंद करते हैं

  • फाइल को आधे रास्ते में 5 0 % टाइप करना,
  • 43210 जी लाइन 43210 पर जाने के लिए
  • :43210 वही करने के लिए

और इस तरह से सामान।

इससे भी बेहतर: उस स्थान पर संपादन शुरू करने के लिए हिट वी (निश्चित रूप से! अब, ध्यान दें कि vim की एक ही कुंजी बाइंडिंग है!


लाइनों को गिनने के लिए भी डेटा को डेटा पढ़ने की आवश्यकता होगी। एक शॉर्टकट संभव होगा फ़ाइल पर संदर्भ / आदेश पर काम करने के लिए एकमात्र तरीका होगा। उदाहरण के लिए यदि निश्चित चौड़ाई समय / तिथि इत्यादि के साथ लॉग लाइनें थीं तो आप विशिष्ट तिथियों / समय के लिए फ़ाइलों के माध्यम से बाइनरी खोज के लिए यूनिक्स उपयोगिता को देख सकते हैं।


व्हाट अबाउट:

tail -n +347340107 filename | head -n 100

मैंने इसका परीक्षण नहीं किया, लेकिन मुझे लगता है कि यह काम करेगा।


sed -e '1,N d; M q' sed -e '1,N d; M q' आप एम के माध्यम से लाइनों एन + 1 प्रिंट करेंगे। यह शायद थोड़ा बेहतर है तो grep -C क्योंकि यह पैटर्न को रेखाओं से मेल करने का प्रयास नहीं करता है।


# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 

बड़ी फाइलों पर विधि 3 कुशल

विशिष्ट लाइनों को प्रदर्शित करने का सबसे तेज़ तरीका






text