AWK - 从SHELL输入变量到模式

时间:2014-11-06 09:34:46

标签: shell variables awk scripting

我想使用awk从文件中提取文本基本上它正常工作但是我想使用变量来寻找模式使用dymamical。

它应该如何运作:

文件test_input包含(btw:从HP DP中提取omnimm -show_locked_devs

Type:     Device
Name/Id:  Drive1
Pid:      28405
Host:     Host1

Type:     Cartridge
Name/Id:  Lib1
Pid:      28405
Host:     Host1
Location: 47
...
  • 得到" Pid" Drive1的数字=>命令查找模式(Drive1)并显示文件test_input(28405)
  • 中的下一行

cat test_input | awk 'c&&!--c;/Drive1/{c=1}'| awk '{print $2}' 28405

  • get" Location" number =>找到所有" Pid" numberes并显示每个匹配的下一个2行(记录)然后使用grep进行过滤" Location"从输出和显示第二个字段(47)

cat test_input | awk 'c&&!--c;/28405/{c=2; print $0}'| grep Location | awk '{print $2}' 47

我注意到AWK中的双引号可以处理SHELL变量,但是当我在脚本中使用SAME命令时,我收到错误消息" awk:语句无法正确解析。"

DRIVE=Drive1;cat test_input | awk "c&&!--c;/$DRIVE/{c=1}" | awk '{print $2}' 28405

如果您有一些提示如何从SHELL获取工作变量,请告诉我。 我也知道我的命令和重定向可能很复杂但是我不是脚本大师:)

2 个答案:

答案 0 :(得分:2)

如果您只需要使用环境变量,那么您可以使用ENVIRON 内置哈希。如果要将参数传递给,可以使用-v选项。

两者的一个例子:

cat >inputfile <<EOT
aaa
bbbxxx
xxxccc
ddd
EOT

VAR=xxx
awk -vVAR="$VAR" '$0~VAR {print ENVIRON["USER"]":"$0}' inputfile

我添加了样本inputfile的创建。

据我所知,在某些版本中,-vVAR之间需要一个空格。

如果我建议您在整个脚本行周围使用'而不是"。如果你使用了很多,它会让生活变得更轻松。

输出:

myuser:bbbxxx
myuser:xxxccc

如果我理解得很清楚,您需要收集非“设备”块中所有设备和所有位置的名称。我假设时钟以标签Type开头,标签顺序始终相同。如果没有,请。通知我。根据这些假设,我的代码如下:

awk '$1=="Type:"{dev=$2=="Device"}
dev && $1=="Name/Id:"{name=$2}
dev && $1=="Pid:"{pids[name]=$2}
!dev && $1=="Pid:"{pid=$2}
!dev && $1=="Location:"{locs[pid]=$2}
END {
    for(i in pids) {
        pid = pids[i];
        print i"\t"(pid in locs ? locs[pid] : "None");
    }
}
' inputfile

它填充pidslocs哈希值,然后打印pids哈希中找到的所有设备名称,该位置属于此pid(如果找到)。

输出:

Drive1  47

当然,如果位置始终位于设备块之后,则可以在找到位置时立即打印该线。因此END部分可能会被删除。

答案 1 :(得分:0)

不清楚你想要什么,但也许这个:

$ cat tst.awk
BEGIN{ RS=""; FS="[:[:space:]]+" }
{
    for (i=1;i<=NF;i+=2)
       name2val[$i] = $(i+1)
}   
(name2val[key] == val) && (tgt in name2val) {
    print name2val[tgt]
}
$
$ awk -v key="Name/Id" -v val="Drive1" -v tgt="Pid" -f tst.awk file
28405
$
$ awk -v key="Pid" -v val="28405" -v tgt="Location" -f tst.awk file
47