আপনি আবার সেড বা অ্যাজকে কল না করে স্ট্রিং থেকে ডট চরিত্রটিকে কীভাবে সরিয়ে ফেলবেন?


12

আমার কাছে একটি ফাইল hostlist.txtরয়েছে যা এতে পাঠ্য রয়েছে:

host1.mydomain.com
host2.mydomain.com
anotherhost
www.mydomain.com
login.mydomain.com
somehost
host3.mydomain.com

আমার কাছে নিম্নলিখিত ছোট স্ক্রিপ্ট রয়েছে:

#!/usr/local/bin/bash

while read host; do
        dig +search @ns1.mydomain.com $host ALL \
        | sed -n '/;; ANSWER SECTION:/{n;p;}';
done <hostlist.txt \
        | gawk '{print $1","$NF}' >fqdn-ip.csv

কোন ফলাফল fqdn-ip.csv:

host1.mydomain.com.,10.0.0.1
host2.mydomain.com.,10.0.0.2
anotherhost.internal.mydomain.com.,10.0.0.11
www.mydomain.com.,10.0.0.10
login.mydomain.com.,10.0.0.12
somehost.internal.mydomain.com.,10.0.0.13
host3.mydomain.com.,10.0.0.3

আমার প্রশ্ন আমি অপসারণ না হয় .শুধু কমা সামনে ছাড়া invoking sedবা gawkআবার? বিদ্যমান sedবা gawkকলগুলিতে বিন্দুটি ছিনিয়ে নেওয়ার জন্য আমি কী পদক্ষেপ নিতে পারি ?

hostlist.txt হোস্টের সংখ্যা বিশিষ্ট থাকবে তাই আমি চাই আমার স্ক্রিপ্টটি দ্রুত এবং দক্ষ হোক।


2
কোন কারণ dig +shortআপনার জন্য কাজ করে না?
রজার লিপসক্বে

@ রজারলিপসকম কারণ আমার হোস্টলিস্ট.টিএসটিএসটিতে কিছু হোস্ট কেবল এফকিউডিএন নয়, তাই আমি তাদের সমাধানের জন্য + অনুসন্ধান ব্যবহার করছি।
লিনুব

উত্তর:


18

sedকমান্ড awkকমান্ড এবং পিছনের সময়ের অপসারণের সমস্ত একটি একক awk কমান্ড একত্রিত করা যেতে পারে:

while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'

বা যেমন একাধিক লাইনে ছড়িয়ে আছে:

while read -r host
do
    dig +search "$host" ALL
done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'

কারণ awkকমান্ডটি doneবিবৃতি অনুসরণ করে , কেবল একটি awkপ্রক্রিয়া শুরু করা হয়েছে। যদিও দক্ষতা এখানে গুরুত্বপূর্ণ নয়, এটি প্রতিটি লুপের সাথে একটি নতুন সেড বা অ্যাজক প্রক্রিয়া তৈরি করার চেয়ে বেশি দক্ষ।

উদাহরণ

এই পরীক্ষার ফাইল সহ:

$ cat hostlist.txt 
www.google.com
fd-fp3.wg1.b.yahoo.com

কমান্ডটি উত্পাদন করে:

$ while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
www.google.com, 216.58.193.196
fd-fp3.wg1.b.yahoo.com, 206.190.36.45

কিভাবে এটা কাজ করে

awk স্পষ্টতই একবারে এর ইনপুট একটি রেকর্ড (লাইন) পড়ে। এই awk স্ক্রিপ্টটি একটি একক ভেরিয়েবল ব্যবহার করে f, যা পূর্ববর্তী লাইনটি একটি উত্তর বিভাগের শিরোনাম ছিল কিনা তা নির্দেশ করে।

  • f{sub(/.$/,"",$1); print $1", "$NF; f=0}

    পূর্ববর্তী লাইনটি যদি একটি উত্তর বিভাগের শিরোনাম ছিল তবে fতা সত্য হবে এবং কোঁকড়ানো ধনুর্বন্ধনীতে কমান্ডগুলি কার্যকর করা হবে। প্রথমটি প্রথম ক্ষেত্র থেকে চলার সময়কাল সরিয়ে দেয়। দ্বিতীয়টি প্রথম ক্ষেত্র প্রিন্ট করে ,, তার পরে এবং শেষ ক্ষেত্রটি অনুসরণ করে। তৃতীয় বিবৃতিটি fশূন্য (মিথ্যা) এ পুনরায় সেট করে।

    অন্য কথায়, fএখানে একটি যৌক্তিক শর্ত হিসাবে কাজ করে। কোঁকড়া ধনুর্বন্ধনী মধ্যে কমান্ডগুলি কার্যকর করা হয় যদি fএটি ননজারো হয় (যা অবাস্তে, এর অর্থ 'সত্য')।

  • /ANSWER SECTION/{f=1}

    যদি বর্তমান লাইনে স্ট্রিং থাকে ANSWER SECTIONতবে ভেরিয়েবলটি (সত্য) এ fসেট করা হয় 1

    এখানে, /ANSWER SECTION/একটি যৌক্তিক অবস্থা হিসাবে কাজ করে। বর্তমানের নিয়মিত অভিব্যক্তির সাথে মিল থাকলে এটি সত্য হিসাবে মূল্যায়ন করে ANSWER SECTION। যদি এটি হয়, তবে কমান্ডটি কোঁকড়ানো ধনুর্বন্ধনীগুলিতে কার্যকর করা হয়েছে।


আপনাকে ধন্যবাদ জন 1024! আমি জানতাম না যে জঞ্জালটি লুপের মধ্যে থাকার দরকার নেই (আমি ভেবেছিলাম এটি বাইরে থাকলে এটি কেবল শেষ লাইনে কাজ করবে)। কি fএকটি অবাধ পরিবর্তনশীল বা f{}awk এর কার্যকারিতা একটি সুনির্দিষ্ট অংশ?
লিনুব

আপনার স্বাগত। fএকটি স্বেচ্ছাসেবী পরিবর্তনশীল। আপনি আসলে {}জটিল যৌক্তিক অবস্থার আগে রাখতে পারেন । fএটি একটি খুব সাধারণ যৌক্তিক অবস্থা: ননজারো, শূন্য হলে মিথ্যা it
1024

@ লিনুব নোট করুন যে দ্বিতীয় কমান্ডে /ANSWER SECTION/যৌক্তিক অবস্থার ভূমিকা পালন fকরেছে, প্রথম কমান্ডের ভূমিকা অনুসারে । আমি এই বিষয়ে আলোচনা করার জন্য উত্তর আপডেট করেছি।
1024

7

digহোস্টনামগুলির তালিকা সম্বলিত একটি ফাইল পড়তে এবং একে একে প্রক্রিয়া করতে পারে। আপনি digউত্তর বিভাগ বাদে সমস্ত আউটপুট দমন করতেও বলতে পারেন ।

এটি আপনার পছন্দসই আউটপুট দেয়:

dig -f hostlist.txt +noall +answer +search | 
    awk '{sub(/\.$/,"",$1); print $1","$5}'

awkপ্রথম ক্ষেত্রের শেষে থেকে sub()আক্ষরিক সময়কে ফেলাতে এর কার্যকারিতা ব্যবহৃত হয় .। তারপরে awkকমা দ্বারা পৃথক করা 1 এবং 5 ক্ষেত্রগুলি মুদ্রণ করে।

দ্রষ্টব্য: hostlist.txtযে সমাধানগুলিতে সমাধান হয় না সেগুলিতে সম্পূর্ণরূপে বাতিল করা হয় - তারা স্টাডআউট বা স্টার্ডারে প্রদর্শিত হয় না।

(লিনাক্স এবং ফ্রিবিএসডি পরীক্ষিত)


6

আপনার অনুরোধটি gawkনিম্নলিখিতটিতে পরিবর্তন করুন :

| gawk '{print substr($1,1,length($1)-1)","$NF}' >fqdn-ip.csv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.