Parece que você quer um sistema de pontuação.
Escreva um script para atribuir uma pontuação a cada linha,
indicando quão cedo a saída você quer ver.
awk parece bem adequado para este trabalho.
Por exemplo:
#!/bin/sh
awk '{score=0}
/usb/ {score=1}
/Plantronics/ {score=2}
{print score, NR, $0}' "$@"
Isso atribui uma pontuação de 0 a cada linha por padrão
e, em seguida, substitui-o por um 1 se a linha contiver usb
e 2 se a linha contiver Plantronics .
Coloquei as instruções usb e Plantronics nessa ordem,
se uma linha contiver ambas as strings, o valor final será 2. Então
./score file.txt | sort -k1nr -k2n | cut -d" " -f3-
(onde score é o nome do script).
sort -k1nr significa classificar com base no primeiro campo (a pontuação),
tratando-o como um número e classificando os valores mais altos primeiro
(porque o script score atribuiu pontuações altas às linhas
você está mais interessado em).
-k2n significa, para linhas que possuem o mesmo valor no primeiro campo,
classificar pelo segundo campo, como um número em ordem normal e crescente.
O segundo campo é NR , o número do registro (a.k.a. line number).
Isso garante que as linhas com a mesma pontuação
(por exemplo, aqueles que contêm usb , mas não Plantronics )
sai em sua ordem original.
Se você não se importa com isso, exclua a declaração NR, da print ,
exclua o -k2n do comando sort e altere o -f3- para -f2- .
(Na verdade, sort pode preservar a ordem assim por padrão,
então você pode não precisar disso.)
Claro que o cut -d" " -f3- retira os números
que o script score foi adicionado aos dados.
Se você não entender como isso funciona, tente executar
./score file.txt
e
./score file.txt | sort -k1nr -k2n
Essa abordagem é bastante flexível. Por exemplo, o código acima produzirá, em ordem,
- todas as linhas contendo
Plantronics, - todas as linhas contendo
usb(mas nãoPlantronics) e - todas as linhas que não contêm nenhum dos itens acima
com cada grupo classificado em ordem de aparição no arquivo de entrada.
Mas, alterando o script score da seguinte maneira,
#!/bin/sh
awk '{score=0}
/usb/ {score+=1}
/Plantronics/ {score+=2}
{print score, NR, $0}' "$@"
podemos atribuir uma pontuação de 3 a linhas que contenham ambas as strings, então agora temos
- todas as linhas que contêm
Plantronicseusb, seguidas por - todas as linhas que contêm
Plantronics(mas nãousb), seguidas por - todas as linhas que contêm
usb(mas nãoPlantronics) e, em seguida, - todas as linhas que não contêm nenhuma das opções acima.