سؤال

ولدي ملف طويل جدا التي أريد لطباعة ولكن تخطي خطوط 1e6 الأولى على سبيل المثال. أنا أنظر في صفحة القط رجل ولكن لا أرى أي خيار للقيام بذلك. أنا أبحث عن أمر للقيام بذلك أو برنامج بسيطة باش.

هل كانت مفيدة؟

المحلول

وستحتاج الذيل. بعض الأمثلة على ذلك:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

إذا كنت حقا بحاجة الى تخطي عدد معين من خطوط "الأولى"، استخدم

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

وهذا هو، إذا كنت ترغب في تخطي خطوط N، عليك أن تبدأ خط الطباعة N + 1. مثال:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

إذا كنت تريد أن ترى مجرد مشاركة هذا العدد الكبير من الخطوط، حذف "+":

$ tail -n <N> <filename>
< last N lines of file. >

نصائح أخرى

إذا كان لديك GNU ذيل متاح في النظام الخاص بك، يمكنك أن تفعل ما يلي:

tail -n +1000001 huge-file.log

وانها شخصية + أن يفعل ما تريد. أن أقتبس من الصفحة رجل:

<اقتباس فقرة>   

وإذا كان الحرف الأول من K (عدد بايت أو خطوط) هو   `+ '، طباعة تبدأ مع هذا البند KTH من بداية كل ملف.

وهكذا، كما لوحظ في التعليق، ووضع +1000001 يبدأ طباعة مع البند الأول بعد خطوط 1،000،000 الأولى.

وأسهل طريقة وجدت لإزالة خطوط العشرة الأولى من ملف:

$ sed 1,10d file.txt

وهناك نسخة أقل مطول مع AWK:

awk 'NR > 1e6' myfile.txt

ولكن أود أن أوصي باستخدام أرقام صحيحة.

مجرد اقتراح بديل sed. :) لتخطي أول مليون خط، في محاولة |sed '1,1000000d'.

مثال:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

وإذا كنت ترغب في تخطي اثنين من السطر الأول
tail -n +3 <filename>

وإذا كنت ترغب في تخطي السطر الأول س
tail -n +$((x+1)) <filename>

إذا كنت تريد أن ترى خط 10 الأولى يمكنك استخدام الحوار الاقتصادي الاستراتيجي على النحو التالي:

sed -n '1,10 p' myFile.txt

وأو إذا كنت تريد أن ترى خطوط 20-30 يمكنك استخدامها:

sed -n '20,30 p' myFile.txt

واستخدم الحوار الاقتصادي الاستراتيجي delete القيادة مع عنوان نطاق و . على سبيل المثال:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

وبدلا من ذلك، إذا كنت ترغب في طباعة فقط مجموعة معروفة استخدام أمر الطباعة مع العلم -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

وهذا الحل يجب أن تعمل بشكل موثوق على كافة أنظمة UNIX، بغض النظر عن وجود المرافق GNU.

وهذا شيل يعمل بشكل جيد بالنسبة لي:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

وتستخدم مع هذا الملف عينة (file.txt):

one
two
three
four
five
six

والأمر (فإنه سيتم استخراج من الثاني إلى السطر الرابع في الملف):

edu@debian5:~$./script.sh 2 4 file.txt

والناتج من هذا الأمر:

two
three
four

وبطبيعة الحال، يمكنك تحسينه، على سبيل المثال عن طريق اختبار أن جميع القيم الحجة هي المتوقعة: -)

ويمكنك القيام بذلك باستخدام الأوامر الرأس والذيل:

head -n <num> | tail -n <lines to print>

وحيث الأسطوانات هي 1e6 + عدد الخطوط التي تريد طباعتها.

sed -n '1d;p'

وهذا الأمر سيتم حذف السطر الأول وطباعة بقية

cat < File > | awk '{if(NR > 6) print $0}'

وكنت بحاجة إلى أن تفعل الشيء نفسه وجدت هذا الموضوع.

وحاولت "ذيل -n +، لكنه مجرد طبع كل شيء.

وو+ خطوط المزيد عملت بشكل جيد على المطالبة، ولكن اتضح أنه تصرف مختلف تماما عندما يتم تشغيله في وضع مقطوعة الرأس (cronjob).

وأخيرا كتبت هذا نفسي:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top