【发布时间】: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 中,除非您有非常具体的需要做其他事情。