怎么在awk里使用shell变量?

linux shell awk by Xudong Zhang @ 2015-10-27 13:02:52

实际上是这样的,我想将系统中所有的包列出来然后按照包的大小进行排序,写了下面这个东西,我想在awk输入大小的时候也输出包名,该怎么弄?

#for i in $(rpm -qa);do rpm -qi $i | awk -F: '/Size/ {print $2}';done | sort -rn

这个只打印包大小,没有文件名,我想实现下面这样的效果,就是print里面也打印下$i

#...   {print $2, $i}   ...

该怎么弄呢?


在awk里很难直接用$i这种方式使用外部shell的变量,但是awk有一个-v的参数可以先定义外部的变量,然后在语句里使用,如下:

$awk -v var1="$i" -v var2="$j"  '{print $0, var1, var2}'

所以你那个shell应该这么写:

#for i in $(rpm -qa);do rpm -qi $i | awk -F: -v var="$i" '/Size/ {print $2, var}';done | sort -rn
by Xudong Zhang @2015-10-27 13:13:56.807 +0800 CST


awk有一个内置的ENVIRON变量,可以用来保存外部的变量,注意这个不是shell内置的变量,所以你可以这样用:

$echo test | var1=hello var2=world awk '{print $0, ENVIRON["var1"], ENVIRON["var2"]}'

所以你那个shell也可以如下:

#for i in $(rpm -qa);do rpm -qi $i | var="$i" awk -F: '/Size/ {print $2, ENVIRON["var"]}';done | sort -rn
by Xudong Zhang @2015-10-27 13:27:49.864 +0800 CST


我来回答

Markdown格式技巧

  • 行尾添加2个空格或者添加一个空行就能换行
  • 斜体: *hello* 或者 _world_
  • 加粗: **hello** 或者 __world__
  • 代码块: 添加空行,然后代码缩进4个空格
  • 特殊字符: 用\避免转义;\*就是*本身
  • python: `__name__`可以以代码形式输出__name__
  • 一个简单的例子

切换到移动版