Grep возвращает ошибку «grep: node_list.txt: Нет такого файла или каталога» - PullRequest
1 голос
/ 10 февраля 2020

У меня есть сценарий, который читает из файла.

################################################
#       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
}

Назначение функций - чтение с главного узла list, затем сортирует список по файлам tmp в соответствии с ролью, назначенной каждому IP или FQDN. Оператор grep фильтрует все строки, начинающиеся с #, и AWK выполняет поиск роли во втором поле и печатает IP-адрес с этой ролью, перенаправленный в файл tmp, который позже будет использован в скрипте.

Моя проблема в том, что раньше эта функция работала нормально. Команды индивидуально работают в моем терминале, и grep может найти файл и отфильтровать его соответствующим образом. Однако, когда ввод в этой функции в этом скрипте, он прерывается.

Я не уверен, что я делаю неправильно. Мой скрипт, помещенный в shellcheck, не обнаружил ошибок, которые могли бы вызвать это.

1 Ответ

1 голос
/ 10 февраля 2020

Некоторые из нас упомянули, что все эти операции сортировки выполняются в одном скрипте awk вместо 5 различных конвейеров в качестве оптимизации - таким образом, файл должен быть прочитан только один раз. Один из способов сделать это - использовать перенаправление вывода in- awk :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...