bashスクリプトでawkを呼び出し、bash変数の値を渡そうとします。これらの変数の数を取得し、awkから渡されたすべての変数を印刷する方法はありますか?
awkに渡される変数の数は動的です。
以下の例
#!/bin/bash
NAME="Dell"
SERIAL="12345"
echo "Hello" | awk -v a=$NAME -v b=$SERIAL '{ print a,b }'
参照、作業例、Irvurの答えはここにあります。
#!/bin/bash
function confirm_peers (){
header_def=("${header_def[@]:-None}")
read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
header=("${header[@]:-${header_def[@]}}") ;
echo -e "\nInput Recorded - ${header[@]} \n"
}
createEncConfig()
{
/usr/bin/awk -f - <<-'EOE' ${header[*]} FS=":" $1
BEGIN {
count=1
for (i = 1; i < ARGC - 2; ++i) {
split(ARGV[i], ar, "=");
print ar[2]
}
print "\nCount=" ARGC -3
}
EOE
}
confirm_peers
# Making array content adaptable to awk input
for x in ${!header[@]} ; do header[x]="a=${header[x]}"; done
createEncConfig $1
参照 - これまでの最も簡単なKusalalanandaの答え
#!/bin/bash
function confirm_peers (){
header_def=("${header_def[@]:-None}")
read -r -p "Enter nodes from header[${header_def[*]}]: " -a header
header=("${header[@]:-${header_def[@]}}") ;
echo -e "\nInput Recorded - ${header[@]} \n"
}
createEncConfig()
{
/usr/bin/awk -v args="${header[*]}" -f - <<-'EOE' FS=":" $1
BEGIN {
count=split(args,ar," ")
for ( x in ar ) {
print ar[x]
}
print "\n" count
}
EOE
}
confirm_peers
createEncConfig $1
出力:ダミーファイルを渡します。
$bash /tmp/a.bsh /tmp/enc1.txt
Enter nodes from header[None]: a b c d
Input Recorded - a b c d
a
b
c
d
Count=4
みんなありがとうございます..
答え1
私が考えることができる1つのオプションは、これらの変数が表示されるように場所を変更することですARGV
。これにより、ブロック内でARGC
変数を使用できなくなります。BEGIN
また、引数として渡したファイル名については、そのファイルawk
数を減算して説明する必要があります。ARGC
echo "Hello" | awk '{ print a, b, ARGC - 1}' a=$NAME b=$SERIAL
DELL 12345 2
答え2
~からあなたのコメント、コマンドラインからプログラムbash
に渡したい配列があるようです。awk
簡単な方法は次のとおりです。
array=("my 1st item" "my 2nd item" "the last item")
(
IFS=:
awk -v var="${array[*]}" '
BEGIN {
array_len = split(var, array, ":")
for (i = 1; i <= array_len; ++i)
printf("Item #%d is \"%s\"\n", i, array[i])
}'
)
これは出力されます
Item #1 is "my 1st item"
Item #2 is "my 2nd item"
Item #3 is "the last item"
その後、配列を取得し、:
- で区切られた項目で構成される単一の文字列に変換します。配列の要素にが含まれている場合は、文字列内の項目を区別するために:
別の文字が選択されます。拡張は${array[*]}
配列内の項目を最初の文字に関連付けるため、$IFS
拡張を実行する前にこの変数を設定します。文字列はawk
変数として渡されますvar
。
プログラムBEGIN
ブロックからawk
配列を作成し、それらを分割して配列の長さを追跡しますarray
。このループは、文字列が正常に分割されたことを示すためのものです。array_len
var
:
変更されていない変数を使用してスクリプトの残りの部分を実行できるように、サブシェルでプログラムを設定してIFS
実行します。awk
IFS
答え3
これで、独自のコマンドラインとそのオプションを取得する方法が提供されていないため、これはファイルシステムなどのLinux内部awk
に依存するいくつかの拡張ですが、ただ楽しさのためのものです(YMMV)。proc
awk -v"VAR1=sd" -va=b -vJ=onny '
BEGIN {("tr \47\\000\\n\47 \47\t\47 </proc/$PPID/cmdline") | getline CMDLN
n = split (CMDLN, ELM, "\t")
for (i=1; i<=n; i++) if (sub ("^-v", "", ELM[i])) {split (ELM[i], T, "=")
print "Option", T[1], "=", T[2]
Options++
}
}
'
Option VAR1 = sd
Option a = b
Option J = onny
読み取っている「コマンド」はgetline
サブシェルで実行されるため、親PIDのコマンドラインとsとtr
文字を取得します。その後、CMDLNはその要素に移動し、各要素の先行する「-v」を一致(および削除)して変数定義を見つけます。これが印刷され、オプションの数が増加します。試してみてください。<NUL>
<LF>
<TAB>
split
答え4
bash配列があり、bashは配列にいくつの要素があるかどうかを知っているので、awkに直接教えてください。
$ array=("my 1st item" "my 2nd item" "the last item")
$ awk -v var="${array[*]}" -v nargs=${#array[@]} '
BEGIN {
print nargs;
}
'
3