grepは複数の部分文字列と一致し、不足している場合は合格または失敗します。

grepは複数の部分文字列と一致し、不足している場合は合格または失敗します。

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"

tolowersは、大文字と小文字を区別しない一致に使用されます。-iここで大文字と小文字を区別しない一致が必要な理由はわかりません。)

関連情報