Estou com falta de conhecimento aqui e não tenho a linguagem adequada para descrever (desculpe por isso). Este é meu comando que está retornando apenas a primeira instância quando encontra uma correspondência em "$WARN"
echo "$WARN"
(W) 2024-08-30T08:08:52 - Restart is required to toggle support
(W) 2024-08-30T09:59:30 - Failed to download RSS feed at 'https://aaa'. Reason: The connection to the remote server timed out
(W) 2024-08-30T10:00:30 - Failed to download RSS feed at 'https://bbb'. Reason: The connection to the remote server timed out
(W) 2024-08-30T10:00:30 - Failed to download RSS feed at 'https://ccc'. Reason: The connection to the remote server timed out
(W) 2024-09-13T08:59:44 - Failed to download RSS feed at 'http://xxx'. Reason: The remote server refused the connection
(W) 2024-09-13T08:59:44 - Failed to download RSS feed at 'http://yyy'. Reason: The remote server refused the connection
(W) 2024-09-13T08:59:44 - Failed to download RSS feed at 'http://zzz'. Reason: The remote server refused the connection
WARN=$(
if [[ "$WARN" == *Failed* ]]
then
printf '%s' "${WARN//''\'*''\'\./...}"
fi
)
echo "$WARN"
(W) 2024-08-30T08:08:52 - Restart is required to toggle support
(W) 2024-08-30T09:59:30 - Failed to download RSS feed at ... Reason: The connection to the remote server timed out
saída esperada : linhas exclusivas e linhas que correspondem a "Falha" são modificadas para remover tudo dentro de aspas simples, incluindo as próprias aspas.
(W) 2024-08-30T08:08:52 - Restart is required to toggle support
(W) 2024-08-30T09:59:30 - Failed to download RSS feed at ... Reason: The connection to the remote server timed out
(W) 2024-09-13T08:59:44 - Failed to download RSS feed at ... Reason: The remote server refused the connection
saída real : por que a segunda linha é omitida da consideração, ou seja, apenas a primeira linha correspondente que contém Failed
é acionada e retornada.
echo "$WARN"
(W) 2024-08-30T08:08:52 - Restart is required to toggle support
(W) 2024-08-30T09:59:30 - Failed to download RSS feed at ... Reason: The connection to the remote server timed out
Se eu classificar a entrada de forma invertida, a segunda ocorrência correspondente de Failed
será omitida.
echo "$WARN"
(W) 2024-09-13T08:59:44 - Failed to download RSS feed at ... Reason: The remote server refused the connection
(W) 2024-08-30T08:08:52 - Restart is required to toggle support
Não quero combinar no final das strings.
Estou substituindo a var $WARN por um novo conteúdo na segunda vez que a crio.
Inicialmente, a
WARN
variável contém várias linhas. Ainda assim, como qualquer variável shell não array, é apenas uma única string e o fato de haver caracteres de nova linha dentro não muda isso.[[ "$WARN" == *Failed* ]]
testa se há uma substringFailed
em algum lugar dentro da string. É um teste agindo na string inteira, não "por linha".Similarmente, a substituição em
${WARN//\'*\'./...}
(para abreviar, removi a barra invertida desnecessária e dois pares de aspas simples que envolviam uma string vazia cada) atua na string inteira de uma vez, não "por linha"; e como*
é ganancioso, então há uma correspondência que começa dentro da primeira linha "failed" e termina na última linha "failed". Em outras palavras, a correspondência inclui várias aspas simples e vários caracteres de nova linha, tudo isso é substituído por...
.Em outras palavras: a linha que
...
você viu na saída consiste no início de uma linha,...
e no fim de uma linha diferente .Use uma ferramenta que processe uma linha por vez, por exemplo
sed
:Observe
.*
que ele'.*'
é ganancioso, ele pode corresponder a uma string contendo'
(ou até mesmo um caractere de nova linha); mas agora não há problema porque processased
cada linha separadamente.Você pode filtrar linhas "semelhantes" canalizando para
uniq
:uniq -f 3
ignora os três primeiros campos, que são(W)
, o timestamp e-
no seu caso. Dessa forma, timestamps diferentes não impedem que as linhas sejam consideradas iguais, apenas o conteúdo que segue importa. Parece que é isso que você quer.Uma lógica mais complexa pode ser implementada, por exemplo, com
awk
.Talvez você possa fazer isso sem a variável. Se o valor da variável veio da saída de
some_tool
então isso pode ser o suficiente:Se o valor da variável veio de
a_file
então isso pode ser suficiente: