Eu estava procurando uma solução no bash que possa extrair informações específicas após uma string especificada.
Depois de uma string especificada? Nenhuma das duas respostas postadas anteriormente faz especificamente isso (porque pegar texto depois de uma string não é a melhor maneira de obter as informações que você disse que queria no seu exemplo).
Aqui estão algumas maneiras de obter texto depois de uma string. Eu usei o seu exemplo, embora a resposta da sobremesa e a resposta de terdon ambos demonstram abordagens mais apropriadas para este caso particular.
Use \K
do Perl, por exemplo, em grep
com -P
(permitir regex Perl) e -o
(somente correspondência):
grep -Po 'string\Kdesired'
Em que string
é uma expressão que corresponde ao que vem antes do que você deseja e desired
é uma expressão que corresponde ao que você deseja gerar. Isso é útil quando o padrão desejado ocorre em outro lugar no arquivo / linha (por exemplo, é um número e o arquivo / linha contém outros números). No seu exemplo, isso poderia ser algo como:
$ acpi | grep -Po 'ing, \K[^,]+'
79%
[^,]+
significa alguns caracteres que não são uma vírgula, portanto, isso pode capturar texto até uma vírgula. Também poderíamos usar ...
para obter três caracteres, mas como apontado em um comentário por PerlDuck , é possível que o padrão que você quer aqui seja maior ou menor que 3 caracteres.
Em sed
, você pode usar grupos de captura com (
e )
:
sed -r 's/.*string(desired).*//'
em que
é o que foi salvo com (
)
. Por exemplo:
$ acpi | sed -r 's/.*ing, ([^,]+).*//'
89%
Aqui está uma maneira de fazer isso apenas com o Bash no seu exemplo
$ output=$(acpi); string="${output#*ing, *}"; desired="${string%,*}"; echo "$desired"
96%
${var#string*}
apara var
antes de string
(inclusive) e ${var%string*}
apara var
após string
(inclusive).
Esta não é de forma alguma uma lista exaustiva. Existem muitas maneiras de fazer isso:)