grep combina várias substrings e passa ou falha em falta

0

Eu tenho um

nginx -V 2>&1 | \
grep -qi 'nginx/1.9.10\|ngx_pagespeed-release-1.9.32.10\|openssl-1.0.2f\|modsecurity-2.9.‌​0' \
&& echo "has the stuff we need" \
|| echo "missing something"

que está indo contra

[root@mage2appblock vagrant]# nginx -V
nginx version: nginx/1.9.10
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.2f  28 Jan 2016
TLS SNI support enabled
configure arguments: --user=www-data --group=www-data
--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid
--lock-path=/var/lock/subsys/nginx
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--add-module=/src/nginx/ngx_pagespeed-release-1.9.32.10-beta
--add-module=/src/nginx/modsecurity-2.9.0/nginx/modsecurity 
--with-http_auth_request_module --with-http_sub_module 
--with-http_mp4_module --with-http_flv_module 
--with-http_addition_module --with-http_dav_module
--with-http_gunzip_module --with-http_gzip_static_module 
--with-http_stub_status_module --with-http_sub_module 
--with-http_v2_module --with-http_ssl_module 
--with-openssl=/src/nginx/openssl-1.0.2f 
--with-sha1=/usr/include/openssl
--with-md5=/usr/include/openssl --with-pcre --with-ipv6 
--with-file-aio --with-http_realip_module 
--without-http_scgi_module --without-http_uwsgi_module

Parece que se eu mudar as substrings de

'nginx/1.9.10\|ngx_pagespeed-release-1.9.32.10\|openssl-1.0.2f\|modsecurity-2.9.‌​0'

para

'nginx/1.9.10\|ngx_pagespeed-release-1.9.32.10\|openssl-1.0.2f\|modsecurity-2.9.‌​1'

Ainda recebo "has the stuff we need" , embora nem tudo estivesse presente. Eu preciso combinar tudo ou nada.

    
por jeremy.bass 02.02.2016 / 19:43

4 respostas

2

Trabalhe com uma pequena modificação:

[ $(nginx -V 2>&1 | 
    grep -cFf <(
        echo 'nginx/1.9.10
ngx_pagespeed-release-1.9.32.10
openssl-1.0.2f
modsecurity-2.9.0'
    )) -eq 4 ] &&
echo "has the stuff we need" ||
echo "missing something"
    
por 02.02.2016 / 22:53
2

Use apenas perl e faça um slurp no arquivo inteiro:

nginx -V 2>&1 | perl -0ne 'print "found\n" if m#nginx/1.9.10# && 
      /ngx_pagespeed-release-1.9.32.10/ && 
     /openssl-1.0.2f/ && /modsecurity-2.9.0/'

Além disso, observe que você tem alguns caracteres ocultos no texto da sua pergunta. Eu não sei se eles também estão lá em sua seqüência de pesquisa real, mas, se forem, eles causarão problemas. Se eu copiar o modsecurity-2.9.‌​0 da sua pergunta e passá-lo por od -c , obtenho:

$ echo modsecurity-2.9.‌​0 | od -c
0000000   m   o   d   s   e   c   u   r   i   t   y   -   2   .   9   .
0000020 342 200 214 342 200 213   0  \n
0000030

Especificamente, de acordo com uniprops , você tem 6 ocorrências de U + FFFD ‹ › \ N {CARACTERE DE SUBSTITUIÇÃO} entre o último . e o 0 .

    
por 03.02.2016 / 11:07
2
awk '/openssl-1.0.2f/ {test1=1} /nginx\/1.9.10/ {test2=1} 
  END { if (test1 && test2) print "has the stuff we need"; 
  else print "missing something"}'

Você também pode definir o código de saída de awk , se precisar.

atualização

versão menor (trata a entrada com quebras de linha como uma única "linha", supondo que a entrada contenha 0x1 caracteres)

awk -v RS='' '/openssl-1\.0\.2f/ && /nginx\/1\.9\.10/ {
 print "has the stuff we need"; exit};{print "missing something"; exit(1)}'
    
por 02.02.2016 / 20:45
0
has_all_iregexps() {
  awk '
    BEGIN {
      if (ARGC <= 1) exit
      for (i = 1; i < ARGC; i++) s[tolower(ARGV[i])]
      n = ARGC - 1
      ARGC = 1
    }
    {
      for (i in s) if (tolower($0) ~ i) {
        delete s[i]; if (!--n) exit
      }
    }
    END {
      if (n) {
        print "Those regexps were not matched:"
        for (i in s) print "  " i
        exit(1)
      }
    }' "$@" >&2
}

E então:

nginx -V 2>&1 |
  has_all_iregexps 'nginx/1\.9\.10' \
                   'ngx_pagespeed-release-1\.9\.32\.10' \
                   'openssl-1\.0\.2f' \
                   'modsecurity-2\.9\.‌​0' &&
  echo "has the stuff we need"

Ou:

has_all_istrings() {
  awk '
    BEGIN {
      if (ARGC <= 1) exit
      for (i = 1; i < ARGC; i++) s[tolower(ARGV[i])]
      n = ARGC - 1
      ARGC = 1
    }
    {
      for (i in s) if (index(tolower($0), i)) {
        delete s[i]; if (!--n) exit
      }
    }
    END {
      if (n) {
        print "Those strings were not found:"
        for (i in s) print "  " i
        exit(1)
      }
    }' "$@" >&2
}

nginx -V 2>&1 |
  has_all_istrings 'nginx/1.9.10' \
                   'ngx_pagespeed-release-1.9.32.10' \
                   'openssl-1.0.2f' \
                   'modsecurity-2.9.‌​0' &&
  echo "has the stuff we need"

(os tolower s são para correspondência insensível a maiúsculas e minúsculas para corresponder ao seu uso de -i , embora não tenha certeza do motivo pelo qual você gostaria de fazer uma correspondência insensível a maiúsculas e minúsculas aqui).

    
por 03.02.2016 / 11:48