নির্দিষ্ট লাইন থেকে একটি ফাইল এবং মুদ্রণ পাঠ্য দেখুন


8

আমার সংরক্ষণ করা ডেটা সহ একটি ফাইল রয়েছে। এখন আমি আমার ফলাফলগুলি একটি নতুন ফাইলে মুদ্রণ করতে চাই।

উদাহরণস্বরূপ, আসুন এই উদাহরণটি নেওয়া যাক randomlog.log:

Link encap:Ethernet HWaddr 08:00:00:00:00:67
inet addr:10.10.10.10 Bcast:10.10.10.10 Mask:255.255.255.0
inet6 addr: fe80::casf:sdfg:23ra:dg12/64 Scope:Link

আমি প্রথম লাইনের দ্বাদশ থেকে বিশতম অক্ষর এবং তৃতীয় লাইনের চতুর্থ থেকে অষ্টম অক্ষরের মধ্যে কীভাবে কেবল ডেটা নিতে পারি? আউটপুটটি এরকম কিছু দেখায়:

Ethernet
t6 ad

এটা কি সম্ভব? আমি লাইনটি সেট করতে এবং অবস্থান থেকে এই অবস্থানটিতে যেতে চাই।

উত্তর:


9

এখানে একটি sedপদ্ধতির:

$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file  
Ethernet
t6 a

ব্যাখ্যা

-nশুষে স্বাভাবিক আউটপুট যাতে এটি শুধুমাত্র ছাপে যখন বলা (সাধারণ প্রত্যেক ইনপুট লাইন প্রিন্ট করতে হয়)। -Eবর্ধিত রেগুলার এক্সপ্রেশনের দেয়।

sedস্ক্রিপ্ট দুই কমান্ড, উভয় প্রতিকল্পন অপারেটর ব্যবহার আছে ( s/original/replacement/)। উইলটি কেবল 1s/.{11}(.{8}).*/\1/pপ্রথম লাইনে চলবে (এটিই কি 1sকরে) এবং লাইনটির প্রথম 11 টি অক্ষরের সাথে মিলবে ( .{11}), তারপরে এটি পরবর্তী 8 টি ক্যাপচার করবে ( (.{8}), প্রথম বন্ধনী একটি "ক্যাপচার গ্রুপ") এবং তারপরে বাকি সমস্ত কিছু থাকবে লাইনের শেষ ( .*)। এই সমস্ত ক্যাপচার গ্রুপে যা ছিল তা দিয়ে প্রতিস্থাপন করা হয়েছে ( \1; যদি দ্বিতীয় ক্যাপচার গ্রুপ থাকত তবে তা হবে \2ইত্যাদি)। অবশেষে, pশেষে ( s/foo/bar/p) প্রতিস্থাপনটি তৈরি করার পরে লাইনটি মুদ্রণের কারণ ঘটায়। এর ফলে কেবলমাত্র 8 টি অক্ষরের আউটপুট হচ্ছে।

দ্বিতীয় কমান্ডটি একই সাধারণ ধারণা ব্যতীত এটি কেবল ২ য় লাইনে চলবে ( 3s) এবং 4 টি অক্ষর 4 থেকে শুরু করবে।


আপনি একই জিনিসটি এর সাথেও করতে পারেন perl:

$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
            elsif($.==3){s/.{3}(.{4}).*/\1/}
            else{next}; print; ' file 
Ethernet
t6 a

ব্যাখ্যা

-neমানে হলো "লাইন দ্বারা ইনপুট ফাইল লাইন পড়া এবং স্ক্রিপ্ট দেওয়া প্রয়োগ -eপ্রতিটি লাইনে করতে। স্ক্রিপ্ট আগের মতই মৌলিক ধারণা। $.পরিবর্তনশীল তাই আমরা পরীক্ষা হলে লাইন সংখ্যা পারেন বর্তমান লাইন সংখ্যা ঝুলিতে 1বা 3, যদি সুতরাং, বিকল্পটি চালান, অন্যথায় এড়িয়ে যান Therefore সুতরাং printকেবলমাত্র এই দুটি লাইনের জন্য কেবল চালানো হবে যেহেতু অন্য সমস্ত এড়িয়ে চলে যাবে।


অবশ্যই, এটি পার্ল, সুতরাং টিমটোড্ডি :

$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file 
Ethernet 
t6 a

ব্যাখ্যা

এখানে, এর -aঅর্থ "প্রদত্ত অক্ষরটিতে প্রতিটি ইনপুট লাইন বিভক্ত করুন -Fএবং অ্যারে হিসাবে সংরক্ষণ করুন @Fgiven প্রদত্ত চরিত্রটি খালি থাকায় এটি ইনপুট লাইনের প্রতিটি অক্ষরকে উপাদান হিসাবে সংরক্ষণ করবে @FThen অ্যারেগুলি 0প্রথম লাইনের জন্য এবং তৃতীয়টির জন্য 3-7- এ গণনা শুরু করে ।


1

অজানা পদ্ধতির:

$ awk 'NR==1{print substr($0,12,8)};NR==3{print substr($0,4,4)}' input.txt  
Ethernet
t6 a

ব্যবহার NRলাইন (awk পরিভাষা - রেকর্ড) নির্ধারণের জন্য নম্বর, এবং সেই অনুযায়ী লাইনের সাবস্ট্রিং প্রিন্ট করা হবে। substr()ফাংশন ফর্ম্যাট হয়

substr(string,starting position,how much offset) 

পাইথন

$ python -c 'import sys                                                                                                                                                
> for index,line in enumerate(sys.stdin,1):                                                                                                                            
>     if index == 1:
>          print line[11:19]
>     if index == 3:
>          print line[3:7]' < input.txt
Ethernet
t6 a

এটি <ইনপুট ফাইল থেকে পাইথন প্রক্রিয়াতে ইনপুট স্ট্রিমটিকে পুনর্নির্দেশ করতে শেল অপারেটর ব্যবহার করে । দ্রষ্টব্য যে পাইথনের স্ট্রিংগুলি 0-সূচিযুক্ত হয়, সুতরাং আপনার পছন্দসই অক্ষর সংখ্যাগুলি 1 দ্বারা স্থানান্তরিত করতে হবে।

বহনযোগ্য শেল উপায়

এই কাজ করে ksh, dash, bash। কেবল শেল ইউটিলিটিসের উপর নির্ভর করে, বাহ্যিক কিছুই নয়।

#!/bin/sh

rsubstr(){
    i=0;
    while [ $i -lt  $2 ];
    do
        rmcount="${rmcount}?"
        i=$(($i+1))
    done;
    echo "${1#$rmcount}"
}

lsubstr(){
    printf "%.${2}s\n" "$1"
}

line_handler(){
    case $2 in
        1) lsubstr "$(rsubstr "$1" 11)" 8 ;;
        3) lsubstr "$(rsubstr "$1" 3)" 5 ;;
    esac
}

readlines(){
    line_count=1
    while IFS= read -r line;
    do
        line_handler "$line" "$line_count"
        line_count=$(($line_count+1))
    done < $1
}

readlines "$1"

এবং এটি এর মতো কাজ করে:

$ ./get_line_substrings.sh input.txt                                                                                                                                   
Ethernet
t6 ad
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.