首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个arg的Awk命令

每个arg的Awk命令
EN

Unix & Linux用户
提问于 2023-02-20 08:26:55
回答 1查看 58关注 0票数 -4

我在bash脚本中有一个awk实现,我希望使用do循环为每个函数arg运行该脚本。每个arg由一个多行字符串组成。

代码语言:javascript
复制
for arg in "$@"; do

done

下面是使用<<< "$@"传递所有函数参数的awk实现。

我想要的是单独使用每个arg,而不是像"$@"那样将所有参数一起传递。

代码语言:javascript
复制
 awk '
   BEGIN {
     kl=0
     kmd="tput sgr0"
     rst = ( (kmd | getline outp) > 0 ? outp : "<" "sgr0" ">" )
     close(kmd)
     ka = "Wht 15 Grn 34 Blu 39 Ylw 11 Red 196 Amb 214"
     kb = "Cyn 51 Mgn 201 Syp 39 Code 39"
     ks = sprintf("%s %s", ka, kb)
     n = split(ks, kaggr)  # split makes kaggr start at index 1
     for ( i=1; i 0 ? outp : "<" knam ">" )
       close(kmd)
      }
    }

   ## Detect keyword in index of array tseq, tseq[indx].
   ($1 in tseq) { kl=1 ; ctp=$1 ; next }

   /Rst:/ { kl=0 ; next }  # Reset colour rendition

   kl { print tseq[ctp] $0 rst }  # Print with specified colour
   !kl { print }                  # Use terminal text colour
' <<< "$@"

在以前的工作中,我遇到了当循环处于管道中时,变量会消失的问题。有关更多细节,请参见。

虽然我认为,对于流水线的情况,awk,消失变量的问题并不是真正的问题。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-02-20 08:41:13

您的循环使用arg作为循环变量,您应该能够使用<<<"$arg"将该变量的内容重定向到您的awk代码中:

代码语言:javascript
复制
for arg do
  awk '...as in the question...' <<<"$arg"
done

或者,如果您想要进行更多的键入,并记住在$@周围包含双引号,

代码语言:javascript
复制
for arg in "$@"; do
  awk '...as in the question...' <<<"$arg"
done

您还可以用printf传递标准输入上的数据,这将使循环POSIX符合(这里的<<< -字符串重定向不是标准的):

代码语言:javascript
复制
for arg do
    printf '%s\n' "$arg" | awk '...as in the question...'
done

所有这些循环变体都将对awk列表中的每个list元素运行一次"$@"代码,不管它们是否是多行的。

请注意,我并没有真正查看您的awk代码,因为问题是关于代码输入的管理。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/736161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档