AWK এর ভিতরে ব্যাশ শেল ফাংশন ব্যবহার করা


24

এটি কি কোনওভাবে অ্যাডব্লিউকে ভিতরে বাশ ফাংশন ব্যবহার করা সম্ভব?

উদাহরণ ফাইল (স্ট্রিং, ইনট, ইনট, ইনট)

Mike 247808 247809 247810

দশমিক থেকে হেক্সাডেসিমালে রূপান্তর করার চেষ্টা করা।

.Bashrc বা শেল স্ক্রিপ্টে ফাংশনটি সংজ্ঞায়িত করা হয়।

awk '{print $1 ; d2h($2)}' file

awk: কল্পনা করা হচ্ছে অপরিবর্তিত ফাংশন ডি 2 এইচ ইনপুট রেকর্ড নম্বর 1, ফাইল ফাইল উত্স লাইন নম্বর 1

উত্তর:


27

system()ফাংশনটি ব্যবহার করার চেষ্টা করুন :

awk '{printf("%s ",$1); system("d2h " $2)}' file

আপনার ক্ষেত্রে systemকল হবে d2h 247808এবং তারপরে এই আদেশের printfআউটপুট আউটপুট যুক্ত করবে:

Mike 3C800

সম্পাদনা করুন:

পরিবর্তে systemব্যবহার হিসাবে আমি অ্যাক্সেসের কোনও উপায় খুঁজে পাচ্ছি না । তবে আপনি এখনও আপনার বর্তমান ব্যাশ স্ক্রিপ্ট থেকে ফাংশন ব্যবহার করতে পারেন:shbash.bashrc

#!/bin/bash
d2h() {
    # do some cool conversion here
    echo "$1" # or just output the first parameter
}
export -f d2h
awk '{printf("%s ",$1); system("bash -c '\''d2h "$2"'\''")}' file

সম্পাদনা 2:

আমি জানি না কেন তবে এটি আমার উবুন্টু 16.04 এ কাজ করছে না। এটি আশ্চর্যজনক, কারণ এটি উবুন্টু 14.04 এ কাজ করত।


d2hএক্সিকিউটেবল হলে এটি কাজ করতে পারে তবে এটি "বাশার্কে বা শেল স্ক্রিপ্টে কোনও" ফাংশন সংজ্ঞায়িত "না হলে নয়।
মাইকেল হোমার

@ মিশেলহোমর হ্যাঁ, আপনি ঠিক বলেছেন। আপনার মন্তব্যে ধন্যবাদ আমি বুঝতে পেরেছি যে আমি কেউই জিজ্ঞাসা না করা প্রশ্নের উত্তর দিয়েছি। তবে আমি বর্তমান স্ক্রিপ্ট থেকে ফাংশনগুলি ব্যবহার করার একটি উপায় খুঁজে পেয়েছি (এবং সম্ভবত অন্যান্য স্ক্রিপ্টগুলির মাধ্যমে source) তবে এটি কেন কাজ করে না তা আমি বুঝতে পারি না .bashrc
আখেরিলিমনো

2
এটি কমান্ড ইনজেকশন দুর্বলতা $2হ'ল শেষের বিষয়বস্তুটিকে শেল কোড হিসাবে ব্যাখ্যা করা হচ্ছে।
স্টাফেন চেজেলাস

8

আপনি বাজেট থেকে ডেকে আনতে পারেন এবং এর আউটপুট ব্যবহার করতে পারেন। এটি প্রায়শই ঘটলে পারফরম্যান্সের দৃষ্টিভঙ্গি থেকে স্পষ্টতই বিপজ্জনক। ম্যান পৃষ্ঠাটি উদ্ধৃত:

command | getline [var]

আউটপুটটি $ 0 বা ভেরিপে পাইপিং কমান্ড চালান,

কমান্ডটি একটি বাশ স্ক্রিপ্ট হবে যাতে এতে ফাংশন সংজ্ঞা থাকে এবং ফাংশনটি কার্যকর করে।


খুব শীতল!
জাজোয়া

আমি এটি বহুবার ব্যবহার করেছি এবং এটি ভালভাবে কাজ করে।
ডেভ রিক্স

4

এটি করার চেষ্টা করুন:

awk '{print $1 ; printf "%x\n", $2}' file

আফাইক, আপনি বাজে ফাংশন ব্যবহার করতে পারবেন না শুধুমাত্র স্ক্রিপ্ট। প্রয়োজনে আপনি একটি awk ফাংশন ব্যবহার করতে পারেন।


3

অ্যাজকের অভ্যন্তরে কোনও ব্যবহারকারী সংজ্ঞায়িত ব্যাশ ফাংশন ব্যবহার করা

দাবি অস্বীকার : আমি বুঝতে পেরেছি যে ওপি এটি চেষ্টা করছে না, তবে গুগল আমার মতো অন্যদেরও এই উত্তরে নিয়ে যাবে।

অবস্থা

আপনার কাছে একটি bashস্ক্রিপ্ট রয়েছে যা ফাংশনগুলির সাথে সংগঠিত হয় (কারণ আপনি নিজেকে বা [বেশিরভাগ] সহকর্মীদের ঘৃণা করেন না) এবং এই ফাংশনগুলির মধ্যে কমপক্ষে 1 টির মধ্যে থেকে অন্যকে কল করা দরকারawk

সমাধান

লিপি

#!/bin/env bash

# The main function - it's a sound pattern even in BASH
main(){
    # In the awk command I do some tricky things with single quotes. Count carefully...
    # The first $0 is outside the single quotes so it is the name of the current bash script.
    # The second $0 is inside the single quotes so it is awk's current line of input.
    awk '{printf("%s. ", ++c); system("'$0' --do"); print $0}'<<-PRETEND_THIS_IS_AN_INPUT_STREAM
        and
        and
        well
    PRETEND_THIS_IS_AN_INPUT_STREAM
}

# functionized to keep things DRY
doit(){
    echo -n "doin' it "
}


# check for a command switch and call different functionality if it is found
if [[ $# -eq 1 && $1 == "--do" ]];
then
        doit
else
        main
fi

আউটপুট

$ ./example.sh
1. doin' it and
2. doin' it and
3. doin' it well

আমি কুইন্সের প্রতিনিধিত্ব করি, তিনি ব্রুকলিনে বড় হয়েছিলেন
ব্রুনো ব্রোনোস্কি

3

awkawkফাংশন চালাতে পারেন । এটি সঞ্চালনের জন্য bash, আপনাকে awkএকটি bashশেল কার্যকর করতে হবে bash, সেই ফাংশনের সংজ্ঞাটি ব্যাখ্যা করতে এবং সেই ফাংশনটিকে কল করতে হবে, awkআর্গুমেন্ট হিসাবে পাস করা মান দিয়ে with

তুচ্ছ নয়।

bashসমর্থন ফাংশন রপ্তানি তাই এটি পরবর্তী আমন্ত্রণ পাওয়া যায় bash, যাতে এক পথে ফাংশনের সংজ্ঞা পাস করার bashদ্বারা প্রার্থনা awk:

export -f d2h

awkকমান্ড কার্যকর করার একমাত্র উপায় ( bashএখানে) এর সাথে রয়েছে system("cmd"), print... | "cmd"বা "cmd" | getline। সব ক্ষেত্রে, এটি awkব্যাখ্যা করার জন্য একটি শেল চালান cmd, তবে এটি হবে sh, না bash। সুতরাং আপনাকে এটির জন্য একটি কমান্ড লাইন তৈরি shকরতে হবে যা একটি অনুরোধ যা ফাংশনটি শুরু করার জন্য bashএকটি bashকমান্ড লাইনকে ব্যাখ্যা করে, সুতরাং আপনার উদ্ধৃতি সহ সতর্কতা অবলম্বন করা উচিত:

export -f d2h
<file awk -v q="'" '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  {print $1; system("bash -c '\''d2h \"$1\"'\'' bash " shquote($2))}'

এর অর্থ এই নয় যে প্রতিটি লাইনের জন্য একটি shএবং একটি চালানো bash, তাই যথেষ্ট অক্ষম হতে চলেছে। bashএটি পড়া এবং একটি বিভাজনের চেয়ে আরও উল্লেখযোগ্যভাবে আরও অদক্ষ হওয়া শেষ হবে while read loop:

(unset IFS; while read -r a b rest; do
  printf '%s\n' "$a"
  d2h "$b"
 done < file)

0

এটি আপনাকে ভাল সম্ভাবনা দেবে।

cat ../logs/em2.log.1 |grep -i 192.168.21.15 |awk '{system("date"); print $1}'

সিস্টেম ফাংশন আপনাকে এওকে স্ট্রিমের মধ্যে বাশ কমান্ড পার্স করতে সক্ষম করে।


0

কেবলমাত্র একটি দ্রুত হ্যাক @ হউকলেজিংয়ের প্রদর্শন করে command|getline :

1) ইনপুট হতে দিন:

Dear friends
my name is `id -nu` and
today is `date "+%Y-%m-%d"`.

ইনপুটটিতে শেল বাক্য গঠন অনুসরণ করে,

`command`

তার প্রয়োগের ফলাফল দ্বারা প্রতিস্থাপন করা ইনলাইন কমান্ডগুলি বোঝাতে ব্যবহৃত হয় ।

2) আমরা ইনলাইন শেল কমান্ড এর মাধ্যমে প্রসারিত করতে পারি:

#!/usr/bin/gawk -f

BEGIN  { FS ="`";        }
NF==3  { $2 | getline $2 }
       { print           }

3) ব্যবহার (সাধারণ chmod পরে):

$ expand-inline input
Dear friends
my name is jjoao and
today is 2018-01-15.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.