前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理?

当时没有找到方法。前两天在QQ群里讨论awk的时候,无意间又聊起这个话题。机缘巧合之下找到一个思路,特此分享。

测试环境:

 [root]# head -1 /etc/redhat-release

Red Hat Enterprise Linux Server release 6.5 (Santiago)

[root]# awk --version | head -1

GNU Awk 3.1.7

众所周知,Shell脚本里面把一个普通变量传递给awk是非常简单的,直接用 -v 参数赋值就行了。

 str1="Hello World"

awk -v str2="$str1" 'BEGIN{print str2}'

但是,要把一个数组传递给awk就不是那么简单的事情了。请看以下三个试验:

1. 简单的数组可以先赋值后split

 arr1=(A B C)

awk -v arr2="${arr1[*]}" 'BEGIN{split(arr2,arr3," "); print arr3[2]}'

2. 有些情况下很难找到合适的分隔符来进行split,因为某个数组元素可能会包含你想用来作为分隔符的那个字符,这时split之后无法得到希望的结果。所以这个方法不够严谨,尤其是当我们无法预测数组元素可能包含哪些字符的时候。

 arr1=(A "B C" D)

awk -v arr2="${arr1[*]}" 'BEGIN{split(arr2,arr3," "); print arr3[2]}'

3. 可以借助export命令和awk的ENVIRON默认数组来实现这个功能

 arr1=(A "B C" D)

for((i=0;i<${#arr1[*]};i++)); do

  export arr1_m$i="${arr1[$i]}"

done

awk 'BEGIN{for(i in ENVIRON)if(i~/arr1_m/)print i "=" ENVIRON[i]}'

我这里只是为了演示功能,所以没有把export变量名的定义和awk内部的字符串匹配写的特别考究,大家可以根据实际情况进行调整(比如添加更多的限制条件等)。

结论:Shell脚本里面把一个数组传递到awk内部进行处理,技术上可行,但不建议在生产环境上使用

如何在linux Shell脚本里面把一个数组传递到awk内部进行处理的更多相关文章

  1. Linux Shell脚本面试25问

    Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...

  2. 阿里Linux Shell脚本面试25个经典问答

    转载: 阿里Linux Shell脚本面试25个经典问答 Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命 ...

  3. 【转】Linux Shell脚本面试25问

    Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...

  4. Linux Shell脚本面试25个经典问答

    1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Sh ...

  5. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  6. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  7. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  8. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  9. Linux Shell脚本攻略 读书笔记

    Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...

随机推荐

  1. java内存设置

    在上边红色框内加入java内存设置命令: -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m

  2. 使用adb shell卸载程序

    个人感觉在命令行中卸载程序要比在手机界面卸载程序要方便许多,配合命令行下的报名查看包名的命令就更加方便了. 1.查看应用准确包名 adb shell pm list package -f |grep ...

  3. 阿里云日志api创建logStore

    , shardCount =  });                 string date = FormatRfc822Date(time);                 string con ...

  4. SQL探险

    两张表,取相同字段比较 相同则显示true  否则FALSE.

  5. Python 操作 MongoDB

    原文 这篇文章主要介绍了使用Python脚本操作MongoDB的教程,MongoDB作为非关系型数据库得到了很大的宣传力度,而市面上的教程一般都是讲解JavaScript的脚本操作,本文则是基于Pyt ...

  6. 解决Kafka-1194问题

    生产环境中使用Kafka作为日志处理的中间件,系统结构是这样的.自12月上线一个多月来,系统运行稳定. 用过kafka的都知道,Kafka产生的消息全部存储到硬盘文件中,并且在消息被消费后不会被立即删 ...

  7. 对atime、mtime和ctime的研究

    前期准备 在实验之前我们在讨论为何会出现两种修改时间,为此我们推测因为修改的不是文件的同一数据,或者说同一地方,那么我们就要先搞清楚文件的结构. linux文件系统是Linux系统的心脏部分,提供了层 ...

  8. 给大一的学弟学妹们培训java web的后台开发讨论班计划

    蓝旭工作室5月大一讨论班课程计划   课时 讨论班性质 讨论班名称 主要内容 主讲人   第一讲 先导课 后台开发工具的使用与MySQL数据库基础 后台开发工具的基本使用方法与工程的创建,MySQL数 ...

  9. Github优秀java项目集合(中文版) - 涉及java所有的知识体系

    Java资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容 ...

  10. <实训|第五天>通过搭建NFS,FTP实现共享文件附Vim脚本游戏

    先说个事情:我周末是不更新这个系列教程的,不过其他内容的会更新,我周末就整理这一周的各种内容到我的微信公众号中,提供给大家! 期待已久的linux运维.oracle"培训班"终于开 ...