【问题标题】:Search pattern in awkawk 中的搜索模式
【发布时间】:2018-11-20 07:30:07
【问题描述】:

我想创建一个脚本来检查条件:

  1. 端口字符串应该存在于文件中,如果是,那么它的值应该是 20000。

  2. 文件应提及 sslkey、sslCert、ssl_cipher(这些字符串/密钥的值可以是任何值)。

尝试过:

$ awk '/port|sslKey|sslCert|ssl_cipher/ {print $2,$3}' pkg.conf
port 20000
sslKey /usr/product/plat/etc/ssl/server.pem
sslCert /usr/product/plat/etc/ssl/server.cert
ssl_cipher ECDH+AES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES:RSA+AESGCM:!aNULL:!RC4:!MD5:!DSS:!3DES

上述命令的问题是即使字符串“port|sslKey|sslCert|ssl_cipher”之一丢失,即使它运行。

这是否可以仅使用几行 awk 来实现。

如果缺少任何字符串/条件,则输出应显示该条件以及满足的条件。

【问题讨论】:

  • 不太清楚,请提及 2 个简单的细项,第一个 - Input_file 样本 第二个 - 预期输出样本,然后让我们知道。

标签: linux bash shell awk


【解决方案1】:

考虑到您在问题中的详细信息是输入示例:

正确:

$ cat pkg.conf
port 20000
sslKey /usr/product/plat/etc/ssl/server.pem
sslCert /usr/product/plat/etc/ssl/server.cert
ssl_cipher ECDH+AES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES:RSA+AESGCM:!aNULL:!RC4:!MD5:!DSS:!3DES

错误(端口 18000 和缺少 sslCert):

$ cat pkg_wrong.conf
port 18000
sslKey /usr/product/plat/etc/ssl/server.pem
ssl_cipher ECDH+AES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES:RSA+AESGCM:!aNULL:!RC4:!MD5:!DSS:!3DES

AWK 解决方案:

正确的 pkg.conf。返回 0 并且不输出任何内容:

$ awk '
/^port [0-9]+$/ { if ( $2 == 20000 ) isport=1; port=$2; }
/^sslKey .+$/ { issslKey=1; sslKey=$2; }
/^sslCert .+$/ { issslCert=1; sslCert=$2; }
/^ssl_cipher .+$/ { isssl_cipher=1; ssl_cipher=$2; }
END { if (isport && issslKey && issslCert && isssl_cipher) exit(0);
      else { print("port " port); print("sslKey " sslKey); print("sslCert " sslCert); print("ssl_cipher " ssl_cipher); exit(1); }
    }
' pkg.conf

错误的 pkg_wrong.conf(端口 18000 和缺少 sslCert):

$ awk '
/^port [0-9]+$/ { if ( $2 == 20000 ) isport=1; port=$2; }
/^sslKey .+$/ { issslKey=1; sslKey=$2; }
/^sslCert .+$/ { issslCert=1; sslCert=$2; }
/^ssl_cipher .+$/ { isssl_cipher=1; ssl_cipher=$2; }
END { if (isport && issslKey && issslCert && isssl_cipher) exit(0);
      else { print("port " port); print("sslKey " sslKey); print("sslCert " sslCert); print("ssl_cipher " ssl_cipher); exit(1); }
    }
' pkg_wrong.conf
port 18000
sslKey /usr/product/plat/etc/ssl/server.pem
sslCert
ssl_cipher ECDH+AES128:ECDH+AESGCM:ECDH+AES256:DH+AES:DH+AESGCM:DH+AES256:RSA+AES:RSA+AESGCM:!aNULL:!RC4:!MD5:!DSS:!3DES

【讨论】:

  • 如果端口不等于 20000 并且如果四个字符串中的任何一个 port|sslKey|sslCert|ssl_cipher not found 那么它应该显示一个错误,如 echo -e "Port is 18000 ,推荐是 20000 和在 conf 文件中找不到 sslCert \n"
  • 您可以将这些详细条件添加到代码中,或者下次准确指定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2012-01-26
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多