Tenho um cenário em que estou criando uma nova variável que terá apenas os servces
valores de uma lista de valores disponíveis no filex
.
$ cat filex
all_name1_db
all_name2_dm
alm_service1_ax
all_name3_du
alz_name4_dx
ali_name5_dk
alk_service2_av
alf_name6_df
alj_name7_dq
Aqui está o código que utilizo para criar uma variável services
que terá apenas os valores que contém serviços.
for x in $filex
do
if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]];then
Services+=$x","
fi
done
Meu resultado final será um valor delimitado por vírgula mostrado abaixo.
$ cat $Services
alm_service1_ax,alk_service2_av
O problema agora é que o service
valor continua aumentando filex
e não posso estender minha if
declaração adicionando ||
. Por exemplo, se eu tiver um novo serviço bum_service3_bk
incluído filex
, minha if
declaração ficaria assim.
...
if [[ $x == *"service1"* ]] || [[ $x == *"service2"* ]] || [[ $x == *"service3"* ]] ;then
...
e isso continuará aumentando para cada novo service
adicionadofilex
Existe uma maneira de escrever uma if
declaração para ter uma única condição que possa acomodar múltiplas condições ou alguma maneira melhor de resolver meu problema?
Responder1
Evite loops para processar texto. Aqui:
grep 'service[123]' filex | paste -sd , -
Ou:
grep 'service1
service2
service3' filex | paste -sd , -
Responder2
Se você precisar de uma resposta de uma linha, use:
grep "service" filex | xargs echo | sed 's/ /, /g'
OU
se você precisar de sintaxe condicional, poderá fazer como:
while read -r line
do
if [[ $line == *"service"* ]]
then
Services+=("$line")
fi
done < "/tmp/filex"
echo "${Services[@]}" | tr ' ' ,
Vai dar como:
alm_service1_ax,alk_service2_av,alk_service5_av,alk_service3_aff,alk_service5_afds
/tmp/filex
- é o caminho do seu arquivo
echo "${Services[@]}" | tr ' ' ,
- imprimindo array separado por vírgula