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"
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.
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
.
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)}'
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).
Tags command-line grep