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 传递变量参数 的相关文章

  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • Django管理命令是在单独的进程中执行的吗?

    Django 有很多管理命令 此外 我们还可以编写自己的命令 进行 shell 调用后会发生什么python manage py XXX 代码是否会在从 shell 启动的进程中执行 或者 shell 进程只是与执行命令的主 Django
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • Windows 10 上的 LibPNG 构建问题

    我试图在 Windows 10 上构建 libpng 以获取 win32 二进制文件 但我认为有一个与 awk 解析带有 CRLF 行结尾的文件相关的问题 我尝试使用 dos2unix 命令转换文件 但没有成功 结果相同 在 make 命令
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content

随机推荐

  • 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 记得