বাশ স্ক্রিপ্টিং - নিম্নলিখিত স্ট্রিংগুলি কীভাবে সংযুক্ত করতে হয়?


8

লিনাক্সে আবিষ্কারের bashস্ক্রিপ্টের অংশটি এখানে রয়েছে cpuid(উবুন্টু / ফেডোরা):

/usr/bin/cpuid > id.txt    
CPUID=id.txt    
echo `grep "extended model" $CPUID` | sed 's/0x//' | awk ' { print $4 } ' > cpu.txt    
a=`cat cpu.txt`    
echo `grep "extended family" $CPUID`| sed 's/0x//' | awk ' { print $4 } ' > cpu.txt    
a+=`cat cpu.txt`

সুতরাং, আমার ল্যাপটপের জন্য স্ক্রিপ্টের এই অংশটি (এখানে দেখানো হয়েছে) 60 দেয়।

এখন কীভাবে কেবলমাত্র স্থানীয় ভেরিয়েবলগুলি ব্যবহার করে, মধ্যবর্তী ফাইল ( cpu.txt) জড়িত না রেখে এটি করবেন ?

উত্তর:


10

একজনের ভিতরে প্রবেশ:

printf '%s%s\n' "$(grep -Pom1 'extended model.*\(\K\d+' <(cpuid))" \
                "$(grep -Pom1 'extended family.*\(\K\d+' <(cpuid))"

উপরের লিভারেজগুলি প্রতিস্থাপন ( <()) এবং কমান্ড প্রতিস্থাপন ( $()) প্রয়োগ করে ।

  • দুটি কমান্ডের বিকল্পগুলি ভিতরে কমান্ডগুলির STDOUT দ্বারা প্রতিস্থাপিত হয়

  • cpuidকমান্ডটি প্রক্রিয়া প্রতিস্থাপনের ভিতরে রাখা হয়, STDOUT ফাইল বর্ণনাকারী হিসাবে ফিরে grepআসবে, এটির grepসাথে প্রয়োজনীয় মিলটি করবে, আমরা -Pকেবলমাত্র ( -o) পছন্দসই অংশ পেতে পিসিআরই ( ) ব্যবহার করেছি , এবং -m1পুনরাবৃত্তি এড়াতে প্রথম ম্যাচের পরে থামব

  • printf পছন্দসই বিন্যাসে আউটপুট পেতে ব্যবহার করা হয়

উদাহরণ:

$ printf '%s%s\n' "$(grep -Pom1 'extended model.*\(\K\d+' <(cpuid))" "$(grep -Pom1 'extended family.*\(\K\d+' <(cpuid))"
30

9

আপনি পাইপ ব্যবহার করে মধ্যবর্তী ফাইল এড়াতে পারবেন এবং উদাহরণস্বরূপ আপনার মিল এবং প্রতিস্থাপন উভয় ব্যবহার করে sedএবং এড়াতে পারবেনawkawk

/usr/bin/cpuid | 
  awk '/extended model/ {mod = substr($4,3)} /extended family/ {fam = substr($4,3)} 
  END {printf "%d%d\n", mod, fam}'

1

অনুমান করা এবং নমুনার প্রকৃতি পরিবর্তন না করে, প্রতিস্থাপনের এখানে একটি ড্রপ যা অনুরোধ অনুসারে আউটপুটটিকে একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে:

CPUID=$(/usr/bin/cpuid)
a=$(echo "$CPUID" | grep 'extended model' | sed 's/0x//' | awk ' { print $4 } ')
a+=$(echo "$CPUID" | grep 'extended family' | sed 's/0x//' | awk ' { print $4 } ')

প্রথম লাইনটি ভেরিয়েবলটিকে I CPUIDএর আউটপুটে /usr/bin/cpuid
সেট করে তারপরে উপরের লাইনে ভেরিয়েবল সেটটির aআউটপুট ( echo) হিসাবে CPUIDসেট করে (এটি তারপরে আপনার সরবরাহিত কমান্ডগুলিতে পাইপ করা হয়)।


1
ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ. এটি আমার বোঝার স্তরের সবচেয়ে কাছের। দুর্ভাগ্যক্রমে, আমি সেড, অ্যাজক এবং পার্ল সম্পর্কে বিশেষজ্ঞ নই, তবে কিছু প্রাথমিক ধারণা আমার কাছে রয়েছে। :-)
কেউ

1
catপ্রথম লাইন সেখানে থাকা উচিত নয়। এটি সিপিইউডিটির ফলে বাইনারি নির্বাহের পরিবর্তে আউটপুটটির বিষয়বস্তু নির্ধারণ করতে বাধ্য করে।
জো

0

sed

cpuid | tac | sed '/^CPU/{s/.*//;x;s/\n//g;p;d};/extended \(model\|family\)/!d;s/.*(\(.*\)).*/\1/;H;d'

আমার যেমন 8 টি কোর রয়েছে, আমার পিসিও প্রকাশ করে:

50  
50  
50  
50  
50  
50  
50  
50  

ট্যাক সিপিইউড থেকে রেখার ক্রমটিকে বিপরীত করে দেয় যাতে আমি সিপিইউ রেকর্ডের টার্মিনেটর হিসাবে সিপিইউ ব্যবহার করতে পারি, একটি বর্ধিত মডেল এবং বর্ধিত পরিবার তারপরে সঠিক ক্রমে ঘটে


0

এটি আপনার প্রাথমিক কমান্ডগুলি অনুকূলিত করে না, তবে অর্ধ-কোলন আপনাকে সম্পূর্ণরূপে কনটেন্টেশন অপারেশন এড়াতে 2 টি কমান্ড একসাথে রাখার অনুমতি দেয়:

foo="$(firstcommand; secondcommand)"

অথবা, আপনার অবস্থার সাথে সুনির্দিষ্ট:

a=$(grep "extended model" $CPUID | sed 's/0x//' | awk ' { print $4 };
grep "extended family" $CPUID | sed 's/0x//' | awk ' { print $4 };)

আপনি যদি নতুন লাইনের বিষয়ে যত্নশীল হন তবে আপনি প্রাথমিকের আগে $(এবং বন্ধ হওয়ার পরে ডাবল-কোট লাগাতে চাইবেন)


0

এটি করার একটি উপায় এখানে রয়েছে awk(আপনার উত্তরের কোড অনুসারে পুরো আউটপুট)।

আপনি যখন একই ইনপুটটিকে বারবার পুনরায় প্রসেস করতে থাকেন তখন এটি সাধারণত নির্দেশ করে যে অন্য পদ্ধতির আরও ভাল হতে পারে।

awkএই জাতীয় পাঠ্য ইনপুট প্রক্রিয়াজাতকরণ জন্য নিখুঁত। awkপ্রোগ্রামগুলি করা জিনিসগুলির চেয়ে অনেক দীর্ঘ হয় sedতবে এগুলি পড়া সহজ হয় এবং আপনি ডিবাগিংকে আরও সহজ করতে তাদের মুদ্রণ বিবৃতি যুক্ত করতে পারেন ।

আমি আমার ডিবাগিং বিবৃতিগুলিতে রেখেছি (মন্তব্য করা)। স্ক্রিপ্টটি কীভাবে কাজ করে তা দেখার জন্য আপনি তাদেরকে অসুবিধা করতে পারেন।

আপনাকে awkপ্রোগ্রামটি কোথাও রাখতে হবে এবং একক ব্যবহারের ক্ষেত্রে সবচেয়ে সহজ জায়গা হ'ল পুরো জিনিসটি একক উদ্ধৃত স্ট্রিংয়ে awkকমান্ড লাইনে রেখে দেওয়া।

এইভাবে আপনাকে এটি আলাদা ফাইল বা অস্থায়ী ফাইলে সংরক্ষণ করতে হবে না, সুতরাং কোনও ফাইল পরিচালনার সাথে জড়িত নেই এবং স্ক্রিপ্টটি নিজেই দাঁড়াবে।

এই প্রোগ্রামটি দীর্ঘ দেখাচ্ছে, তবে এটি প্রায় সমস্ত মন্তব্য, ডিবাগিং বিবৃতি এবং সাদা স্থান।

#!/bin/bash

## Whole awk program is one single quoted string
## on the awk command line
## so we don't need to put it in a separate file 
## and so bash doesn't expand any of it
## Debugging statements were left in, but commented out

/usr/bin/cpuid | awk '
BEGIN {  ## initialize variables - probably unnecessary
  em = ""
  ef = ""
  fa = ""
  mo = ""
  si = ""
  ps = ""
}

## get each value only once

## extended model is in field 4 starting at the third character
## of a line which contains "extended model"
/extended model/ && em == "" {
  em = substr($4, 3)
  ##print "EM " em
}

## extended family is in field 4 starting at the third character
## of a line which contains "extended family"
/extended family/ && ef == "" {
  ef = substr($4, 3)
  ##print "EF " ef
}

## family is in the last field, starting at the second character
## and is two characters shorter than the field "()"
## of a line which starts with "family"
## (so it does not match "extended family")
$1 == "family" && fa == "" {
  ##print NF " [" $NF "]"
  ##print "[" substr($NF, 2) "]"
  l = length($NF) - 2
  fa = substr($NF, 2, l)
  ##print "FA " fa
}

## model is in the third field, starting at the third character
## of a line which starts with "model"
## (so it does not match "extended model")
$1 == "model" && mo == "" {
  mo = substr($3, 3)
  ##print "MO " mo
}


## stepping id is in field 4 starting at the third character
## of a line which contains "stepping id"
/stepping id/ && si == "" {
  si = substr($4, 3)
  ##print "SI " si
}

## processor serial number is in field 4 starting at the third character
## of a line which contains "processor serial number:"
/processor serial number:/ && ps == "" {
  ps = $4
  ##print "PS " ps
}

## Quit when we have all the values we need
em != "" && ef != "" && fa != "" && mo != "" && si != "" && ps != "" {
  exit
}

END {
  print em ef fa mo si " " ps
}
'

0

এখনও অবধি, আমি সমস্ত মন্তব্য পড়ছি, এবং আমি সেগুলি সমস্ত ব্যবহার করার চেষ্টা করব। আমি এনজিআরডসকে যেমন লিখেছি: "দুর্ভাগ্যক্রমে, আমি সেড, অ্যাজক এবং পার্ল সম্পর্কে বিশেষজ্ঞ নই, তবে কিছু প্রাথমিক ধারণা আমার কাছে রয়েছে।

যারা এই দুর্দান্ত উদাহরণগুলি দিয়েছেন / উপস্থাপন করেছেন তাদের সবাইকে অনেক ধন্যবাদ। আমি আন্তরিকভাবে আশা করি আরও অনেক লোক এই লাইনগুলি পড়বে এবং তাদের স্ক্রিপ্টিং দক্ষতা আরও গভীর করবে!

প্রকৃতপক্ষে, আপনারা আমাকে যা বলেছিলেন তার একটি ককটেল আমি করেছি:

/usr/bin/cpuid > id.txt  ***[CPUID=$(cat /usr/bin/cpuid) does not work for me]***  
CPUID=id.txt  
a=$(echo `cat $CPUID | grep -m1 'extended model' | sed 's/0x//' | awk ' { print $4 } '`)  
a+=$(echo `cat $CPUID | grep -m1 'extended family' | sed 's/0x//' | awk ' { print $4 } '`)  
a+=$(echo `cat $CPUID | grep -m1 'AMD' | sed 's/(//' | sed 's/)//' | awk ' { print $13 } '`)  
a+=$(echo `cat $CPUID | grep -m1 'model' | sed 's/0x//' | awk ' { print $3 } '`)  
a+=$(echo `cat $CPUID | grep -m1 'stepping id' | sed 's/0x//' | awk ' { print $4 } '`)  
a+=' '  
a+=$(echo `cat $CPUID | grep -m1 'processor serial number:' | awk ' { print $4 } '`)  
echo $a

ফলাফলটি : 40651 0004-0651-0000-0000-0000-0000 যা আমি প্রত্যাশা করি! :-)


যদি আপনি সেগুলি করতে যাচ্ছেন এবং যাইহোক awk ব্যবহার করছেন, তবে এটি পুরোপুরি একটি ছোট অ্যাজক প্রোগ্রাম হিসাবে পুনরায় লেখা ভাল। এছাড়াও, সেই প্রথম লাইনটি কেন কাজ করে না তা উত্তর হিসাবে এনজিআরডসকে আমার মন্তব্য দেখুন।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.