【问题标题】:Bash find occurrences of a value in a file that would not be enclosed in commentsBash 在文件中查找不会包含在注释中的值的出现
【发布时间】:2014-07-15 19:04:36
【问题描述】:

您好,我正在尝试编写一个验证脚本,允许我检查各种 tomcat 配置文件中的设置。我可以 grep 寻找我正在寻找的值,但是作为注释掉的部分可以跨越多行,我试图寻找 start () 注释值的第一次出现。 这是tomcat的server.xml配置文件的sn-p,其中块没有被注释掉,我想grep找到SSLEnabled的值。

   <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="/opt/cloudhost/tomcat6/security/keystore.jks" keystorePass="changeit"
           clientAuth="false" sslProtocols="TLSv1,TLSv1.1,TLSv1.2"
           ciphers="TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,... [Sortened cipher list fro readability]" />

现在图片如果上面提到的配置被注释掉了,我会忽略它,不考虑设置集。因此请注意配置保留默认值(如果它当然有一个,但与我的问题并不真正相关):

<!--

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="/opt/cloudhost/tomcat6/security/keystore.jks" keystorePass="changeit"
           clientAuth="false" sslProtocols="TLSv1,TLSv1.1,TLSv1.2"
           ciphers="TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,... [Sortened cipher list fro readability]" />

-->

我在想我可以这样做:

lineNumber=$(grep -n <somevalue> filename|awk '{ print $1 }')

基于this question,我试过了

 tail -n $lineNumber server.xml| grep -n  '<!--'

它确实返回行但似乎从文件顶部开始并且还缺少一些条目。我不明白为什么。

我也试过了:

sed '25,$!d' server.xml |grep -n '<!--'

产生相同的结果

【问题讨论】:

  • 提供一些示例数据和您的预期输出。
  • 如果您只是想找到一种模式,请使用grep。如果您只是想在一行上用字符串替换模式,请使用sed。对于其他任何事情,为了您自己的理智,只需使用awk
  • 例如。这是我正在寻找的行: 我想找到“”的行号,那么我知道我最初搜索的内容没有被注释掉。有意义吗?
  • 编辑您的问题,向我们展示一些格式正确的示例输入和预期输出。

标签: bash sed grep tail


【解决方案1】:
awk 'NR>24 && /<!--/ {print; exit}' file

将在第 24 行之后打印包含 &lt;!-- 的第一行。

【讨论】:

  • 我很困惑。它似乎显示了之前的行。 echo "确保仅对启用 SSL 的连接器设置安全:第 1.6.9 节。" LineNumber=$( grep -n SSLEngine=\"on\" /etc/tomcat6/server.xml |awk '{ print $1 }') LineNumberWithoutColon="${LineNumber%?}" echo $LineNumberWithoutColon awk '$LineNumberWithoutColon
  • 我看到的另一个问题是,我需要一种方法在搜索“
  • cmets 中没有块格式,因此如果您有一些格式化文本要向我们展示,您需要编辑您的问题以包含它,而不是在评论中发布。话虽如此,awk 脚本再简单不过了,它不会对行号感到困惑,也不关心搜索模式周围的前导或尾随空格,所以我最好的猜测是您的输入文件是在 Windows 上创建的,因此包含破坏您的输出的虚假 control-M 字符。在文件上运行 cat -v 以查看它们并运行 dos2unix 或类似的以删除它们,然后在其上运行 awk 脚本。
【解决方案2】:

所以这就是我最终要做的事情,虽然它可能不是最好的解决方案,但我确实完成了我的任务。

cat $CATALINA_HOME/conf/server.xml | sed '/<!--.*-->/d'| sed '/<!--/,/-->/d' | sed -n '/<.*[Cc]onnector.*port="8443"/,/\/>/p' | awk '/SSLEnabled=\"true\"/'|wc -l

我使用 sed 删除了配置中所有被注释掉的块,然后用 grep 搜索了我希望检查的设置。在上述情况下,我正在寻找配置文件中未注释的部分,该部分的连接器端口设置为 8443 且 SSLEnabled=true。然后我计算结果并检查计数是否等于 1。如果是,则通过它,如果不是,则失败。这是因为它要么未设置,要么定义了多个,并且需要评估配置。

最后,在使用 sed 从模式空间中删除注释块之后,我搜索了具有所需模式 ([Cc]onnector) 的所需值,而 sed 抑制了除匹配模式之外的所有输出 (-n) (p) 并使用 awk 查找随附的 SSLEnabled 设置。然后统计结果(wc -l)。

【讨论】:

    猜你喜欢
    • 2016-12-21
    • 2010-12-17
    • 2021-05-24
    • 2012-07-07
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多