【问题标题】:grep: No such file or directory for line in filegrep:文件中的行没有这样的文件或目录
【发布时间】:2020-10-14 12:53:35
【问题描述】:

我正在尝试 grep 文件中的每一行,并且对于每个匹配回显通过,对于每个不匹配回显失败。我收到“没有这样的文件或目录”错误,它似乎是在尝试 grep 文件而不是我在循环中传递的行?

文件:

$ cat new.txt
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

失败的脚本:

#!/bin/bash

while IFS= read -r line
do
    if grep -P 'TLS_RSA' $line; then
        echo "PASS."
    else
        echo "FAIL."
    fi
done < "new.txt"

当对文件运行正常的 grep 命令时,这是输出(预期):

$ grep -P 'TLS_RSA' new.txt
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 抱歉,我已将示例编辑得更简单,并在复制和粘贴时打错了字。
  • awk '{ if ($0 ~ /TLS_RSA/) print "PASS"; else print "FAIL" }' new.txt 是另一种选择。
  • 请注意,您不需要 IFS= ,因为您的读取仅使用 1 个变量; $line 无论如何都会得到整条线。并且您不需要 -P 选项到 grep,因为您不使用任何 Perl 特定的正则表达式功能。但正如 Cyrus 所建议的那样,您可能希望 grep 的 -q (--quiet) 选项不打印匹配的行。

标签: bash grep


【解决方案1】:

我建议更换

if grep -P 'TLS_RSA' $line; then

if grep -q 'TLS_RSA' <<< "$line"; then

为 grep 的标准输入提供变量的内容。

【讨论】:

  • 非常感谢,这行得通!在快速谷歌之后,它似乎是一个“这里的字符串”,我不知道。
【解决方案2】:
#!/bin/bash
while IFS= read -r line; do
     grep -q 'TLS_RSA' <<< $line && echo "PASS."|| echo "FAIL."
done < "new.txt"

您需要将 $line 替换为

另外为了代码更简洁,你也可以去掉 if 语句,把它变成一行。

【讨论】:

  • 代码的简洁性值得商榷——或者在旁观者的眼中。我不会按照问题中的方式格式化代码;但我也不会使用&amp;&amp;||
【解决方案3】:

您还可以使用 awk 作为在脚本中循环的替代方法

awk '{ print "grep -o \"TLS_RSA\" "$0" && echo -e \""$0"\nPASS\" || echo -e \""$0"\nFAIL\""  }' new.txt | bash

这会为 new.txt 文件中的每一行(文件)打印 grep 命令,然后将命令通过管道传递给 bash 以执行

作为替代方案,您可以使用 awk 的内置系统功能等:

awk '{ system("grep -o \"TLS_RSA\" "$0" && echo -e \""$0"\nPASS\" || echo -e \""$0"\nFAIL\"")  }' new.txt

注意 - 您需要小心这些命令间接示例。在执行实际命令之前打印并验证命令(即在第一个示例中通过管道运行命令到 bash)非常重要。

【讨论】:

    【解决方案4】:

    您可以不使用grep,但只需内置 POSIX shell 功能即可:

    #!/usr/bin/env sh
    
    while IFS= read -r line
    do
      case $line in
        *TLS_RSA*) printf %s\\n PASS.;;
        *) printf %s\\n FAIL.;;
      esac
    done <new.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2021-06-24
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多