【问题标题】:Grep returns 'grep: node_list.txt: No such file or directory' errorGrep 返回 'grep: node_list.txt: No such file or directory' 错误
【发布时间】:2020-02-10 10:48:58
【问题描述】:

我有一个从文件中读取的脚本。

################################################
#       IP TABLES FOR INSTALL_CONFIG           #
#                                              #
# m = master                                   #
# k = kibana                                   #
# d = data                                     #
# i = ingest                                   #
# c = coordinator                              #
# Format: xxx.xxx.xxx.xxx m                    #
################################################
#
10.1.7.93 m
10.1.7.94 k
10.1.7.95 d

这是脚本使用的函数。

function readIpFile () {
    initMasterVar=0

    grep "^[^# ]" node_list.txt | awk '$2 ~ /m/ { print $1 }' > tmp_master_list.txt
    grep "^[^# ]" node_list.txt | awk '$2 ~ /k/ { print $1 }' > tmp_kibana_list.txt
    grep "^[^# ]" node_list.txt | awk '$2 ~ /i/ { print $1 }' > tmp_ingest_list.txt
    grep "^[^# ]" node_list.txt | awk '$2 ~ /d/ { print $1 }' > tmp_data_list.txt
    grep "^[^# ]" node_list.txt | awk '$2 !~ /k/ { print $1 }' > tmp_all_nodes.txt
}

该功能的目的是从主节点列表中读取,然后根据每个 IP 或 FQDN 分配的角色将列表排序为 tmp 文件。 grep 语句过滤所有以 # 开头的行,AWK 在第二个字段中搜索角色,并打印具有该角色的 IP,重定向到脚本中稍后使用的 tmp 文件。

我的问题是,以前,这个功能运行良好。这些命令在我的终端中单独运行,并且 grep 能够找到该文件并相应地对其进行过滤。但是,当在此脚本中输入此函数时,它会中断。

我不确定我做错了什么。我的脚本在放入 shellcheck 时不会出现任何会导致这种情况的错误。

【问题讨论】:

  • 脚本的工作目录中不存在该文件。
  • (顺便说一句,您可以在一次 awk 调用中完成所有操作。无需 grep 或多次运行。)
  • 文件与脚本一起上传到我的测试服务器。我可以毫无问题地从终端运行命令。我也对这个单一的 awk 调用感兴趣,我在某处读到使用 grep 进行过滤在技术上更快,然后将输出传递给 awk。
  • 如果有东西在为你运行这个脚本,那么它的工作目录很可能不是你想象的那样。
  • node_list.txt 是否与您的脚本存在于同一目录中并不重要,重要的是 node_list.txt 是否存在于与您的脚本被调用的同一目录中。在某些情况下,首先greping 可能会使整体执行速度稍微快一点,但在其他情况下,它可能会使其速度变慢,因此不必担心 - 无论哪种方式,差异都可以忽略不计,只需完成所有操作在 awk 中,除非您有非常具体的需要做其他事情。

标签: bash awk grep


【解决方案1】:

我们中的一些人提到在单个 awk 脚本中而不是 5 个不同的管道中进行所有这些排序作为优化 - 这样,文件只需读取一次。一种方法是使用 in-awk output redirection:

awk '/^[# ]/   { next } # Skip lines starting with a # or space.
     $2 ~ /m/  { print $1 > "/path/to/tmp_master_list.txt" }
     $2 ~ /k/  { print $1 > "/path/to/tmp_kibana_list.txt" }
     $2 ~ /i/  { print $1 > "/path/to/tmp_ingest_list.txt" }
     $2 ~ /d/  { print $1 > "/path/to/tmp_data_list.txt"   }
     $2 !~ /k/ { print $1 > "/path/to/tmp_all_nodes.txt"   }' /path/to/node_list.txt

【讨论】:

  • 我现在正在测试它,但这更紧凑,感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2016-11-01
  • 2020-03-29
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多