使用grep命令

时间:2016-08-12 07:55:56

标签: linux bash shell unix

我正在编写一个ansible-deployment项目的脚本,它几乎完成了,只是修复了bug。 此脚本的一个选项是对先前指定的程序进行版本检查(例如fontconfig)Ansible提供以下输出:

PLAY [all] 
********************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.40.132]
ok: [192.168.40.133]
ok: [192.168.40.134]
ok: [192.168.40.135]

TASK: [Find affected package] *************************************************
changed: [192.168.40.135]
changed: [192.168.40.132]
changed: [192.168.40.133]
changed: [192.168.40.134]

TASK: [debug var=dpkg.stdout_lines] *******************************************
ok: [192.168.40.132] => {
"dpkg.stdout_lines": [
    "ii  fontconfig                    2.11.0-6.3+deb8u1           i386         generic font configuration library - support binaries",
    "ii  fontconfig-config             2.11.0-6.3+deb8u1           all          generic font configuration library - configuration",
    "ii  libfontconfig1:i386           2.11.0-6.3+deb8u1           i386         generic font configuration library - runtime"
]
}
ok: [192.168.40.133] => {
"dpkg.stdout_lines": [
    "ii  fontconfig                    2.11.0-6.3+deb8u1           i386         generic font configuration library - support binaries",
    "ii  fontconfig-config             2.11.0-6.3+deb8u1           all          generic font configuration library - configuration",
    "ii  libfontconfig1:i386           2.11.0-6.3+deb8u1           i386         generic font configuration library - runtime"
]
}
ok: [192.168.40.134] => {
"dpkg.stdout_lines": [
    "ii  fontconfig                     2.11.0-6.3+deb8u1           amd64        generic font configuration library - support binaries",
    "ii  fontconfig-config              2.11.0-6.3+deb8u1           all          generic font configuration library - configuration",
    "ii  libfontconfig1:amd64           2.11.0-6.3+deb8u1           amd64        generic font configuration library - runtime"
]
}
ok: [192.168.40.135] => {
"dpkg.stdout_lines": [
    "rc  fontconfig                     2.11.0-6.3                  amd64        generic font configuration library - support binaries",
    "rc  fontconfig-config              2.11.0-6.3                  all          generic font configuration library - configuration",
    "rc  libfontconfig1:amd64           2.11.0-6.3                  amd64        generic font configuration library - runtime"
]
}

PLAY RECAP ********************************************************************
192.168.40.132             : ok=3    changed=1    unreachable=0    failed=0
192.168.40.133             : ok=3    changed=1    unreachable=0    failed=0
192.168.40.134             : ok=3    changed=1    unreachable=0    failed=0
192.168.40.135             : ok=3    changed=1    unreachable=0    failed=0

我想过滤掉包含例如版本为2.11.0-6.3的服务器的IP地址,但不包括2.11.0-6.3 + deb8u1。 目前我正在使用以下命令进行过滤($ ver以前是从直接输入中读取的):

cat output.txt | grep -B 3 $ver

这么好,到目前为止还好,但上面提到的情况不起作用。 所以我尝试使用

part1="'(^| )";
part2="( |$)'";
done=$part1$ver$part2;
cat output.txt | grep -E $done -B 3

但是收到错误:

grep: »(« or »\(« without closing bracket
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

的用法
cat output.txt | grep -E "$done" -B 3

cat output.txt | grep -E '$done' -B 3

有效,但我没有得到任何输出。

请帮忙。 谢谢!

1 个答案:

答案 0 :(得分:1)

要获得与2.11.0-6.3匹配的IP地址,请尝试:

$ awk  '/ 2.11.0-6.3 /{print $1}' RS='ok:' output.txt
[192.168.40.135]

使用shell变量指定版本:

$ ver='2.11.0-6.3'
$ awk -v ver="$ver"  '$0~(" " ver " "){print $1}' RS='ok:' output.txt
[192.168.40.135]

请注意,ver被视为正则表达式。这意味着必须转义像+这样的正则表达式活动字符。