Como pesquisar e extrair string da saída do comando?

2

SO: Kernel 2.6.x

Utilitários: do busybox 1,2x

Um comando gera várias linhas de texto.

string1 text1: "asdfs asdf adfas"
string2 text2: "iojksdfa kdfj adsfj;"
string3 text3: "skidslk sadfj"
string4 text4: "lkpird sdfd"
string5 text5: "alskjfdsd safsd"

Objetivo: eu preciso procurar a linha que contém "text4:" (sem as aspas) e depois extrair todos os caracteres depois da string até o final da linha.

Saída desejada: "lkpird sdfd" (com aspas)

Atualmente tenho ...

command | grep 'text4:' | awk -F': ' '{print $3}'

Existe uma maneira mais simples de escrever isso?

    
por uihdff 23.09.2017 / 08:58

2 respostas

5

Usando sed

$ command | sed -n 's/.*text4://p'
 "lkpird sdfd"

-n informa ao sed para não imprimir a menos que explicitamente como para. s/.*text4:// informa ao sed para remover qualquer texto desde o início da linha até a ocorrência final de text4: . Se tal linha for encontrada, o p informará ao sed para imprimi-lo.

Usando grep -P

$ command | grep -oP '(?<=text4:).*' 
 "lkpird sdfd"

-o diz ao grep para imprimir apenas a parte correspondente. (?<=text4:).* corresponde a qualquer texto que segue text4: , mas não inclui text4: .

A opção -P requer o GNU grep. Assim, ele não funcionará com o built-in grep do busybox nem com o padrão grep nos sistemas BSD / Mac OSX.

Usando o awk

A solução grep-awk original pode ser simplificada:

$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"

Usando o awk (alternativo)

$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
 "lkpird sdfd"

/text4:/ seleciona linhas que contêm text4: . sub(/.*text4:/, "") diz ao awk para remover todo o texto do início da linha para a última ocorrência de text4: na linha. print diz ao awk para imprimir essas linhas.

    
por 23.09.2017 / 09:02
3

Com grep e seu suporte PCRE e \K notificar.

command |grep -Po 'text4: \K.*'
    
por 23.09.2017 / 09:14