나는
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"
이는 다음과 관련이 있습니다.
[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
하위 문자열을 변경하면
'nginx/1.9.10\|ngx_pagespeed-release-1.9.32.10\|openssl-1.0.2f\|modsecurity-2.9.0'
도착하다
'nginx/1.9.10\|ngx_pagespeed-release-1.9.32.10\|openssl-1.0.2f\|modsecurity-2.9.1'
"has the stuff we need"
비록 모든 것이 거기에 있는 것은 아니지만, 나는 여전히 그것을 얻습니다. 모두 일치해야 하거나 일치하지 않아도 됩니다.
답변1
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"}'
awk
필요한 경우 종료 코드를 설정할 수도 있습니다.
고쳐 쓰다
더 짧은 버전(입력에 0x1 문자가 포함되어 있다고 가정하면 개행 문자가 있는 입력은 단일 "라인"으로 처리됩니다)
awk -v RS='\1' '/openssl-1\.0\.2f/ && /nginx\/1\.9\.10/ {
print "has the stuff we need"; exit};{print "missing something"; exit(1)}'
답변2
약간의 수정을 거쳐 작동합니다.
[ $(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"
답변3
perl
전체 파일을 사용 하고 읽으십시오.
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/'
또한 질문 텍스트에 숨겨진 문자가 있다는 점에 유의하세요. 실제 검색 문자열에도 이러한 내용이 있는지는 알 수 없지만, 만약 그렇다면 문제가 발생할 수 있습니다. 귀하의 질문을 복사하여 modsecurity-2.9.0
전달 하면 다음 od -c
과 같은 결과를 얻습니다.
$ 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
구체적으로, uniprops
당신은 에 따르면 6 번 나타났습니다.U+FFFD <�> \N{대체 문자}마지막 .
과 마지막 사이 0
.
답변4
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
}
그런 다음:
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"
또는:
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"
( tolower
s 는 의 사용과 일치하도록 대소문자를 구분하지 않는 일치에 사용됩니다 -i
. 여기서 대소문자를 구분하지 않는 일치를 원하는 이유는 잘 모르겠습니다.)