簡體   English   中英

我可以在awk中導入/使用bash函數嗎?

[英]Can I import/use a bash function in awk?

我有一個相當大的bash函數庫,可以在應用程序中使用。 該庫將作為環境文件導入。 由於函數已導出,因此我可以在其他bash腳本中使用這些函數,而不會出現任何問題。

但是,還有另一個問題,我需要使用awk scriptlet,並且希望盡可能使用bash庫中的幾個函數。

簡而言之,我希望能夠執行以下兩項操作之一:

  1. 在awk的bash環境文件中使用該功能
  2. 在awk腳本中導入bash環境文件,並使用使用該環境文件導出的任何變量和/或函數。

作品:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# set -o posix;OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test;check_flag RAD
[root@test@Test1001 scripts]# echo $?
0

不起作用:

[root@test@Test1001 scripts]# . mfg.env
[root@test@Test1001 scripts]# awk -v st=ssa -v 'env=OSMAJVER=12 EVMAJVER=11 EVMINVER=1 SYSTEM_ARCH=SSA HOST=test' -f /tmp/s1.awk /tmp/template.mf
bash: check_flag: No such file or directory 127

s1.awk

BEGIN {
  FS=":"
  if (system("set -o posix;"env)!=0) {
    print "***ERROR - ENV string not valid to shell - cannot continue"
    exit 1
  }
}

/^[[:space:]]*#/{next}
/^[[:space:]]*$/{next}

{
  # field 3 processing
  n_a=split($3,a_st,",")
  # field 4 re-glue around ":" if required
  cmd=$4
  for (i=5; i<=NF; i++) cmd=cmd":"$i
  if (cmd) cmd="set -o posix;"env";"cmd
  f=0;for (i=1; i<=n_a && !f; i++) if (a_st[i]==st) f=1
  print "CMD: "cmd
  if ($3=="" || $3=="*" || f)
  system(cmd)
}

MF文件:

text:S3:rcs,ssa:check_flag RAD

我希望僅在“ check_flag RAD”返回true時才能處理上述行。

你不能。

可以使用export -f從父shell導出函數,然后從awk運行另一個bash實例作為子進程。 但是,這正接近黑客的高度。 如果您提供了您實際打算完成的工作的更多詳細信息,我們幾乎可以肯定會找到一種更好的做法。

更好的做法是構造awk腳本,以編寫一個流,您的shell本機代碼可以讀取該流並對其進行操作-有關字段讀取輸入流的最佳實踐,請參見BashFAQ#1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM