【发布时间】:2015-01-02 18:02:43
【问题描述】:
我想使用 awk 从文件中提取文本,它基本上可以正常工作,但我想使用变量使其动态化以查找模式。
它应该如何工作:
文件 test_input 包含(顺便说一句:从 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
...
- 获取 Drive1 的“Pid”编号 => 命令查找模式 (Drive1) 并显示文件 test_input (28405) 中的下一行
cat test_input | awk 'c&&!--c;/Drive1/{c=1}'| awk '{print $2}'
28405
- 获取“位置”编号 => 查找所有“Pid”编号并显示每个匹配项的下 2 行(记录),然后使用 grep 过滤输出中的“位置”并显示第二个字段 (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 获取工作变量有一些提示,请告诉我。 我也知道我的命令和重定向可能很复杂,但我不是脚本大师 :)
【问题讨论】:
-
请。不要使用
cat file|awk ...,应该是awk '' file。并且在一个管道中使用多个awk和grep通常可以简化为单个awk。 -
@Jidder:你的建议至少少了一个笑脸! ;)
-
只对变量进行双引号,其他所有内容保持单引号。像这样:
awk 'c&&!--c;/'"$DRIVE"'/{c=1}' -
这里有大约 1e3 个关于将变量传递给 awk 的问题。请搜索...
标签: shell variables awk scripting