টাইমস্ট্যাম্প থেকে প্রথম কোলন ':' কীভাবে সরিয়ে ফেলবেন?


10

আমি প্রোগ্রামিং এ নতুন!

যে কেউ :টাইমস্ট্যাম্পে প্রথম অবস্থানে এটিকে সরাতে সহায়তা করতে পারে ::29.06.2019 23:03:17

বর্তমানে আমি নীচে দেখানো মত awk / কাট কমান্ড ব্যবহার করে এটি করার চেষ্টা করছি:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"


29.06.2019 23

আর আউটপুট আমি যা চাইছিলাম তা নয়! আমি এটি হিসাবে মুদ্রণ করতে চান 29.06.2019 23:03:17

উত্তর:


14

প্রথম চরিত্রটি কাটাতে, আপনি এটি ব্যবহার করতে পারেন cut -c:

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17

11

ব্যবহার

cut -d: -f2-

পরিবর্তে

cut -d: -f2

দ্বিতীয় ক্ষেত্র থেকে লাইনের শেষ পর্যন্ত কিছু পেতে:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"

8

awkএটি একটি দুর্দান্ত সরঞ্জাম এবং এটির সাহায্যে আপনি খুব জটিল কাজগুলি সমাধান করতে পারেন। তবে আপনার প্রশ্নের জন্য আমি বাশের প্রাথমিক ক্ষমতাগুলিতে স্থির থাকব।

এই সহজ সাবস্টিং অপসারণের জন্য, আমি নিম্নলিখিতগুলি করব:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

এটি মুদ্রণ করবে:

29.06.2019 23:03:17

আমি যখন আপনার অবস্থানে ছিলাম এবং প্রোগ্রামিং এবং ব্যাশ শিখতে শুরু করি তখন আমি এই হ্যান্ডবুকটি অনেক শিখেছি:

এবিএস - অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড

আপনার সমস্যার আরও কয়েকটি উদাহরণ এবং আকর্ষণীয় তথ্য এখানে পাওয়া যাবে , 'সাবস্ট্রিং অপসারণ' সন্ধান করুন।


3
+1 এটি! যেহেতু প্রশ্নটিকে "বাশ" ট্যাগ করা হয়েছে, তাই এটি বাহির দুর্দান্ত (যদিও প্রায়শই অস্পষ্ট) স্ট্রিংগুলির দক্ষতাগুলি বাহ্যিক সরঞ্জামগুলি লোড করার চেয়ে অনেক দ্রুতগতির দক্ষতার পক্ষে অগ্রাধিকার দেওয়া বিবেচনা করা উচিত।
রেক্সকোগিটানস

2
@rexkogitans যেহেতু আমরা ইতিমধ্যে গ্রেপ বা একটি ফাইল পার্স করার জন্য awk কল করছি, বাশ দ্রুত হবে না। প্রকৃতপক্ষে, যখনই আপনার একটি ফাইল ব্যাশ সংশোধন করা দরকার তখন ধীর হয়ে যাবে। সমস্ত শেল সবচেয়ে ধীর এবং বাশ বেশিরভাগের চেয়ে ধীর। এটি বলেছিল, শেলের স্ট্রিং ম্যানিপুলেশন ক্ষমতাগুলি প্রায়শই সর্বোত্তম পন্থা হয় তবে কেবল যদি আপনার ইতিমধ্যে ভেরিয়েবল হিসাবে ইনপুট থাকে।
টেরডন

8

এখানে একটি sedসমাধান:

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17

কমান্ডটি sed 's/^://'যা করছে তা হ'ল খালি স্ট্রিং সহ প্রতিটি লাইনের শুরু থেকে sকোলন চরিত্রটি প্রতিস্থাপন করা ।:^//

এখানে একটি জটিল awkসমাধান দেওয়া হয়েছে, যেখানে আমরা ক্ষেত্রের বিভাজকটিকে ^:উপরে বর্ণিত, এবং দ্বিতীয় ক্ষেত্রের (প্রতিটি লাইনের) আউটপুট পরিবর্তন করব :

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17

টাস্কটি grep( ব্যাখ্যা ) দিয়েও সম্পাদন করা যেতে পারে , সম্ভবত এটি প্রচুর পরিমাণে ডেটার জন্য দ্রুত সমাধান হতে পারে:

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17

অথবা নিম্নলিখিত কমান্ডের মাধ্যমে ফাইলটি সরাসরি প্রক্রিয়া করুন, যেখানে সীমাবদ্ধতাটি ^সরানো হয়েছে:

grep -Po 'Logfile started :\K.*' process.log

উপরোক্ত sedদলগুলি এবং ক্যাপচার দ্বারাও অর্জন করা যেতে পারে ()->\1:

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log

যেখানে অভিব্যক্তিটি ^.*<something>.*$পুরো লাইনের সাথে মিলবে, এতে রয়েছে <something>। কমান্ডটি s/old/new/প্রথম ক্যাপচার গ্রুপের সামগ্রী দ্বারা এই লাইনটিকে প্রতিস্থাপন করবে (বন্ধনীগুলির মধ্যে প্রকাশ আরও কংক্রিট হতে পারে)। বিকল্পটি -rবর্ধিত নিয়মিত অভিব্যক্তিগুলিকে সক্ষম করে। বিকল্পটি -nস্বাভাবিক আউটপুটকে দমন করবে sedএবং শেষ অবধি কমান্ডটি pমিলগুলি মুদ্রণ করবে।


আমি কখনই জানতাম না যে awkকোনও বিশেষ অর্থ সহ অক্ষরগুলি সহ একটি বহু চরিত্রের FS থাকতে পারে! আমি আজ শিখেছি জিনিস।
ফ্লোরিস

6

যেহেতু আপনি ইতিমধ্যে এটিতে প্রক্রিয়া করছেন awk, আপনি সরাসরি পুরো কাজটি সরাসরি করতে পারেন:

$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

subকমান্ড সাধারণ ফরম্যাট sub(/REGEX/, REPLACEMENT, TARGET)এবং রেগুলার এক্সপ্রেশন জন্য সব ম্যাচ প্রতিস্থাপন করবে REGEXস্ট্রিং সঙ্গে REPLACEMENTইনপুট স্ট্রিং TARGET। এখানে আমরা তৃতীয় ক্ষেত্র ( ) এর সাথে প্রথমটি :( ^অর্থ "শুরু") প্রতিস্থাপন করছি $3nothing

অবশ্যই, আপনি যদি এটি অবাস্তবভাবে করছেন, আপনি পাশাপাশি কিছুটা বিশ্রীভাবে করতে পারেন এবং পুরো কাজটি একটি একক ক্রিয়ায় সম্পন্ন করতে পারেন:

$ echo "Logfile started :29.06.2019 23:03:17" | 
    awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

অথবা, আপনার ক্ষেত্রে:

TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"

0

আর একটি বাশ সমাধান:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • এটি মধ্যবর্তী ভেরিয়েবল অ্যাসাইনমেন্টের পরিবর্তে পাইপলাইনটি ব্যবহার করে।
  • কমান্ডটি (স্ট্যান্ডার্ড ইনপুট) কমান্ডের অবস্থানগত পরামিতিতে xargsরূপান্তর করে ।stdinbash
  • echoসঙ্গে প্রতিস্থাপন tail -n1 /path/to/reportfile.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.