shell 向 awk 传递变量参数

2023-11-07

本文翻译自StackOverflow提问—— “How do I use shell variables in an awk script?”,但更改了文章段落结构和部分表述。

方式1、使用 -v 选项(最好的方式,兼容性最佳)

使用-v选项(P.S. 记得在选项和变量名之间加上空格)

variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two

该方式应该是兼容大多数版本的awk的,并且,变量也能在BEGIN块中被访问。

如果你想向awk中传递多个变量:

awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'

警告 : 带\的字符序列会被转义,即\t会变成真的tab。所以如果你想在awk中对\t进行保留,那么你可以用ENVIRON[]或者ARGV[]这两个环境变量来获取。
(P.S. 如果你喜欢使用三个竖条|||来作为分隔符,那么它们不会被转义,可以用-F "[|][|][|]"


方式2、使用环境变量ENVIRON[]

在调用awk之前,先设置好变量,然后在awk中通过环境变量ENVIRON来获取:

X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash


方式3、使用ARGV

将目标变量作为awk命令的参数传入:

v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data

如果希望不仅仅局限在awk的BEGIN块中访问目标变量,可以这样:

v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test

方式4、awk代码块后部追加变量

将待传递变量追加到awk命令的代码块之后,但这样仅可在除BEGIN块以外的地方,访问目标变量:

variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file

多个变量:

awk '{print a,b,$0}' a="$var1" b="$var2" file

这种代码块之后增添变量的方式,也可以用于给不同文件分别指定字段分隔符FS

awk 'some code' FS=',' file1.txt FS=';' file2.ext

代码块之后的变量,__无法__在BEGIN块中使用!

echo "input data" | awk 'BEGIN {print var}' var="${variable}"

方式5、Here-string

目标变量也可以通过 here-string 的方式传给awk,前提是shell支持here-string(bash支持):

awk '{print $0}' <<< "$variable"
test

这和下边的写法是一致的:

printf '%s' "$variable" | awk '{print $0}'

即:here-string 被当作文件输入处理了
here-string 不支持在 BEGIN 代码块中使用!


方式6、!!慎用!! 直接在awk代码块中使用

目标变量也可以直接在awk代码中使用,但是这会有“代码注入”的风险。如果别有用心的人,在变量中加入一些可执行的“坏”东西,而被awk当作code的一部分给执行了,那就糟了:

variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two

以下是一个代码注入的例子:

variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000

许多命令都可以通过上述代码注入的方式,诱导awk执行,甚至可以导致机器宕机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 向 awk 传递变量参数 的相关文章

随机推荐

  • RBM中的Gibbs,CD-K,PCD三种抽样方式

    首先看RBM教程推导 http blog csdn net itplus article details 19207371 推导到下图时 对中括号中的第二项进行计算 是 通过采样的到的 那么采样有三种方法 Gibbs CD K PCD 下面
  • JDBC的原理及应用

    一 JDBC作用 JDBC Java DataBase Connectivity 就是Java数据库连接 简单说就是封装了java语言操作不同据库 例如 mysql oracle sqlServer等数据库 的接口 各个数据库厂商实现这个接
  • SpringBoot 多模块的优点与必要性

    使用多模块的原因 使用Java技术开发的工程项目 无论是数据处理系统还是Web网站 随着项目的不断发展 需求的不断细化与添加 工程项目中的代码越来越多 包结构也越来越复杂这时候工程的进展就会遇到各种问题 1 不同方面的代码之间相互耦合 这时
  • vsCode注释快捷键

    系列文章目录 文章目录 系列文章目录 前言 一 pandas是什么 二 使用步骤 1 你也可以选择代码 使用上方菜单的 编辑 来手动注释代码 前言 VScode怎么注释掉一段代码 快捷键直接搞定 一 pandas是什么 示例 pandas
  • vue 封装组件供全局使用_Vue如何封装高质量组件

    依照MVC模式思想来解释高可复用性 低耦合性的组件定义方法 组件分类 级别从小到大 基础组件 只是一种宽泛的定义 可见场景较多 与业务无关的组件 比如列表 表格 输入框等 没有实际的UI 故不能直接使用 UI组件 与基础组件同级 为基础组件
  • python os.walk 指定遍历深度_使用os.walk()以递归方式遍历Python中的目录

    试试这个 usr bin env python coding utf 8 FileTreeMaker py author legendmohe import os import argparse import time class File
  • STM32实现74HC595控制

    一 前言 本文主要是实出74HC595的简单控制功能实现 学习笔记整理 二 概述 一 74HC595简述 74HC595是一个8位串行输入 平行输出的位移缓存器 平台行输出为三态输出 在SCHCP的上升沿输入 在STCP的上升沿进入存储寄存
  • 测试开发-晋级之路4-函数进阶(闭包 装饰器)***

    一 闭包 在上面我们见过了再函数中调用函数本身 那么在函数中可不可以定义一个函数 问题需求 如何函故外部调用函数内部定义的函数 问题的引入 到底什么是闭包 闭包的概念 一个完整的闭包须满足一下三个条件 1 函数中嵌套一个函数 2 外层函数返
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • 如何在工作中利用AIGC提质增效?

    引言 人工智能技术快速发展 以 ChatGPT 为代表的新的人工智能语言模型的出现与更迭 引发人们极大的兴奋和关注 越来越多的企业开始将 AI 技术应用到生产流程 以提高工作效率和生产力 AIGC AI Generated Content
  • SQLMAP 脱库过程(post请求,三种方法)

    一 准备工作 1 sqlmap为python语言开发 因此需要具备python环境 2 python环境搭建及sqlmap下载 可参考其他文章 很多也很全 这个不是本文重点 因此略过 二 环境搭建 1 本人使用的是Mac windows7虚
  • Python自动化运维之一(Python入门)

    Python简介 python是吉多 范罗苏姆发明的一种面向对象的脚本语言 可能有些人不知道面向对象和脚本具体是什么意思 但是对于一个初学者来说 现在并不需要明白 大家都知道 当下全栈工程师的概念很火 而Python是一种全栈的开发语言 所
  • AdaDelta算法

    记录一下自己的学习过程 也能让自己的印象更深吧 AdaDelta算法主要是为了解决AdaGrad算法中存在的缺陷 下面先介绍一下AdaGrad算法优点和以及存在的问题 AdaGrad的迭代公式如下所示 x t
  • C#异常处理18条最佳实践

    首先 异常处理应该是系统设计规约的一部分出现在系统设计文档中 而不仅仅是一种技术实现 作为设计文档的一部分 异常处理应该着眼于系统容错性和稳定性 正如楼主提到的那样 然后在根据这个规约 再来具体讨论和选择异常处理中使用的各种技术细则 比如
  • 飞机大战小游戏

    欢迎来到程序小院 飞机大战 玩法 单机屏幕任意位置开始 点击鼠标左键滑动控制飞机方向 射击打掉飞机 途中遇到精灵吃掉可产生联排发送子弹 后期会有Boss等来战哦 开始游戏https www ormcc com play gameStart
  • 文字点选验证码识别(上)-YOLO位置识别

    声明 本文以教学为基准 本文提供的可操作性不得用于任何商业用途和违法违规场景 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任 如有侵权 请联系我进行删除 文章中没有代码 只有过程思路 请
  • mysql8设置sql_mode

    原文 mysql8报错 在mysql配置文件下设置 sql mode NO AUTO VALUE ON ZERO STRICT TRANS TABLES NO ZERO IN DATE NO ZERO DATE ERROR FOR DIVI
  • 重磅!阿里推出国产开源的jdk!

    简介 Alibaba Dragonwell 是一款免费的 生产就绪型Open JDK 发行版 提供长期支持 包括性能增强和安全修复 阿里巴巴拥有最丰富的Java应用场景 覆盖电商 金融 物流等众多领域 世界上最大的Java用户之一 Alib
  • 同样25岁,为什么有人事业有成,有人却一无所有?

    文章来源知乎 https www zhihu com question 21726594 文 陈彬 我刚过24周岁的生日 虚岁的话也算是25了 说下自己吧 我是农村孩子 我爸是木工 初中文化 我妈是农村妇女 小学没上完 算认得几个字 我上面
  • shell 向 awk 传递变量参数

    本文翻译自StackOverflow提问 How do I use shell variables in an awk script 但更改了文章段落结构和部分表述 方式1 使用 v 选项 最好的方式 兼容性最佳 使用 v选项 P S 记得