Como encontrar texto em um arquivo no bash e fazer eco da saída e adicioná-lo a uma variável

1

Estou tentando fazer um script bash que precisa encontrar http://0.0.0.0:3468/* em vários logs em /opt/plex/*.log , exibi-lo no terminal para o usuário e, ao mesmo tempo, adicioná-lo a uma variável.

Como posso fazer isso?

Exemplo: Imprima http://0.0.0.0:3468/abc no terminal e crie uma variável no script chamado TOKEN=abc .

    
por Freedo 16.10.2017 / 08:48

1 resposta

2

Com base nos requisitos supostos dos comentários, você precisa de algo como abaixo

#!/usr/bin/env bash

token=()
while IFS= read -r line; do
    printf '%s\n' "$line"
    token+=( "${line##*/}" )
done< <(awk '$0 ~ "http://0.0.0.0:3468/"' /opt/plex/*.log)

Isso imprimirá todas as linhas correspondentes contendo o URL para o console. Em vez de usar uma variável para armazenar a saída do token, você pode usar uma matriz em bash para anexar o conteúdo após / usando a sintaxe de expansão de parâmetro do tipo ${word##*} , que remove a cadeia até a última ocorrência de / e imprime a seqüência restante. Então, quando o script estiver concluído, você poderá imprimir a lista de tokens como apenas

printf '%s\n' "${token[@]}"

e acessar o token individual fazendo um loop pela matriz

for ((i=0; i< ${#token[@]}; i++ )); do 
    printf '%s\n' "${token[i]}"
done

(ou) como apenas usando índices de array ${token[0]} , ${token[1]} etc.

Se sua necessidade se resume a obter um único valor de string do conjunto de arquivos, use apenas grep ou Awk como

token=$(awk -vFS=/ '$0 ~ "http://0.0.0.0:3468/"{print $NF}' /opt/plex_autoscan/*.log)

(ou) com GNU grep como

token=$(grep -oP 'http://0.0.0.0:3468/\K.*) /opt/plex_autoscan/*.log
    
por 16.10.2017 / 09:05

Tags