我想使用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
...
cat test_input | awk 'c&&!--c;/Drive1/{c=1}'| awk '{print $2}'
28405
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获取工作变量,请告诉我。 我也知道我的命令和重定向可能很复杂但是我不是脚本大师:)
答案 0 :(得分:2)
如果您只需要使用环境变量,那么您可以使用ENVIRON
awk内置哈希。如果要将参数传递给awk,可以使用-v
选项。
两者的一个例子:
cat >inputfile <<EOT
aaa
bbbxxx
xxxccc
ddd
EOT
VAR=xxx
awk -vVAR="$VAR" '$0~VAR {print ENVIRON["USER"]":"$0}' inputfile
我添加了样本inputfile
的创建。
据我所知,在某些awk版本中,-v
和VAR
之间需要一个空格。
如果我建议您在整个脚本行周围使用'
而不是"
。如果你使用了很多awk,它会让生活变得更轻松。
输出:
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
它填充pids
和locs
哈希值,然后打印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