今天写脚本,遇到awk脚本向shell传参的情况,上网谷歌一下,发现都有些麻烦,通过管道,通过eval,感觉都很复杂。于是想到用read来试一下。

首先构造一个测试文件test.txt,里面的内容是1 2 3。

一开始尝试

awk '{print $1 $2 $3}' test.txt | read a b c

可是echo $a,发现为空,失败了。

试了下

echo "1 2 3" | read a b c

也无法给a b c 赋值

看来read不是这样用的,怒谷歌之,在stackoverflow找到一个类似的问题(stackoverflow真神器啊!)

链接:http://stackoverflow.com/questions/374687/why-is-echo-foo-read-a-echo-a-not-working-as-expected

里面有答主提到,

read a < <(echo foo)

可以对a赋值,试了一下,果然可以。

然后尝试

read a b c< <(echo foo goo hoo)

也可以分别对a b c进行赋值!太激动了!

之后尝试

read a b c< <(awk '{print $1 $2 $3}' test.txt)

失败了,a的值变成了123,b,c为空。

这是为什么?因为awk没有打印空格,只打印123,理所当然都赋给a了。

所以,加上分隔符

read a b c< <(awk '{print $1 " " $2 " " $3}' test.txt)

这下就成功了!

考虑到我的awk还要更复杂一些,再做些改造

read a b c< <(grep  test.txt | awk '{test=$1;test2=$2;test3=$3}END{print test,test2,test3}')

也成功了!

所以,awk可以通过这样的方式向shell传值。

awk如何向shell传值的更多相关文章

  1. Awk中调用shell命令

    Awk中调用shell命令 需求 在awk中,有时候需要调用linux系统中命令,如计算字符串的MD5值,并保存下来. 方法参考 call a shell command from inside aw ...

  2. awk中使用shell的环境变量

    awk中使用shell的环境变量一:"'$var'"这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:var="test"awk 'BEGIN ...

  3. Shell awk文本处理,shell脚本编写

    Shell awk文本处理,shell脚本编写 一:内容包含awk.变量.运算符.if多分支 <a>语法糖: awk [options] 'commands' files option - ...

  4. awk中引用shell变量的方法

    1.通过命令行参数定义变量时引用: awk -v awk变量名= shell变量名 #!/bin/bash var4bash=test awk -v var4awk="$var4bash&q ...

  5. awk如何区分shell脚本传进来的参数和自身的参数?awk如何获取shell脚本传进来的参数;awk中如何执行shell命令

    问题:对于shell脚本,$0表示脚本本身,$1表示脚本的第一个参数,$2……依次类推:对于awk,$1表示分割后的第一个字段,$2……依次类推.那么对于shell脚本中的awk如何区分两者呢? 答案 ...

  6. awk内引用shell变量【自己手动加精】

    题目 [root@localhost ~]# cat 1.txt iii sss ddd 执行命令 [root@localhost ~]# A=0 [root@localhost ~]# awk '{ ...

  7. awk中引用shell变量执行替换的脚本

    遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...

  8. awk中使用shell变量

    方法:使用-v参数. 对于多个shell变量使用多个-v 有个关于shell变量中的空格问题:

  9. awk里面执行shell命令

    先把文件列表存在filename文件中 先 awk '{system("rm $0")}' filename -------WRONG 因为对于 system来说 $0 不再是某行 ...

随机推荐

  1. Tree Recovery

    #include<stdio.h> #include<string.h> void build(int n,char*s1,char*s2) { )return ; ])-s2 ...

  2. Fedora瘦身

    启用的服务 systemctl list-unit-files --type=service | grep enabled 所有服务 systemctl list-unit-files --type= ...

  3. Thinkphp的知识内容

    详细的介绍内容:https://baike.so.com/doc/5504725-5740469.html

  4. 《DSP using MATLAB》Problem 6.8

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  5. css中的margin(外边框)、border(边框)、padding(填充)的区别

    Margin(外边距) - 清除边框外的区域,外边距是透明的. Border(边框) - 围绕在内边距和内容外的边框. Padding(内边距) - 清除内容周围的区域,内边距是透明的. Conten ...

  6. Go Example--锁

    package main import ( "fmt" "math/rand" "runtime" "sync" &qu ...

  7. ie6,ie7下a标签无法点击(转载)

    前几天在做一个网站的引导页面,因为都是用图片,所以按钮需要用空a标签来做,发现a标签在IE6与IE7中点击无效中点击不了,其他浏览器都正常.一开始以为是z-index的问题,但不论z-index设置多 ...

  8. Http&Tomcat

    一张图 tomcat的安装和启用: Tomcat有安装版和解压版(绿色版)安装版以.exe形式的安装包,双击安装到我们的电脑上,用的比较少.解压版,即绿色版,解压后直接使用,用的比较多 bin:脚本目 ...

  9. 关于Spring IOC的学习和理解

    面向对象——三层架构(表现层.业务层.持久层) 三层架构:即表现层.业务层.持久层. ① 持久层:采用DAO模式,建立实体类和数据库表映射(ORM映射).也就是哪个类对应哪个表,哪个属性对应哪个列.持 ...

  10. Redis源码剖析和注释(七)--- 快速列表(quicklist)

    Redis 快速列表(quicklist)1. 介绍quicklist结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现. 通过列表键查看一下:redis 列表键命令详解 127.0. ...