bash - 实际的 bash 字符串存储 awk 源

标签 bash awk

我一直使用习惯的单引号从 bash 调用 awk 命令。 如何使用实际的字符串来存储 awk 源代码,然后将其引入到 awk 命令中?

printf '%s\n' "$@"  \
  | awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl"  \
    '{ if ( $0 ~ prl ) {
         fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
       else {
         fm = "%s\n" ; printf(fm, $0) }
     }'

变化是

str="
{ if ( $0 ~ prl ) {
    fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
  else {
    fm = "%s\n" ; printf(fm, $0)
   }
}"

然后我可能会调用该命令

printf '%s\n' "$@"  \
  | awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl" "$str"

最佳答案

如果没有有关您要解决的问题的更多信息 - 不要将代码存储在字符串中,请使用函数:

foo() {
  awk -v frg="$ctp" -v rst="$sgr" -v prl="$rl"  \
    '{ if ( $0 ~ prl ) {
         fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
       else {
         fm = "%s\n" ; printf(fm, $0) }
     }'
}

printf '%s\n' "$@"  \
  | foo

或者:

foo() {
  awk -v frg="$1" -v rst="$2" -v prl="$3"  \
    '{ if ( $0 ~ prl ) {
         fm = "%s%s%s\n" ; printf(fm, frg, $0, rst) }
       else {
         fm = "%s\n" ; printf(fm, $0) }
     }'
}

printf '%s\n' "$@"  \
  | foo "$ctp" "$sgr" "$rl"

或类似的。

这样您就可以从 awk 脚本中封装所需的功能,同时避免 shell 脚本与 awk 脚本紧密耦合。

关于bash - 实际的 bash 字符串存储 awk 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75704641/

相关文章:

shell - 如何将一个文件中的值与另一文件中的值进行比较

bash - 如何将变量从脚本传递到我使用 cat 生成的文件?

git - AWK - 解析 git status 命令中的第二列

bash - 在 bash 脚本中将字符串转换为整数 - "Leading Zero"数字错误

linux - 用于查找 && mkdir 的 Bash 脚本

linux - 使用 grep regex 搜索多行模式

linux - Bash - 获取最近 12 小时的文件/复杂的名称格式

awk - 使用 awk 进行表查找

bash - bash脚本中点的用法

bash - 使用 Bash 进行函数式编程