Este é o comando que você está tentando:
jack_lsp -p | grep -B1 input | head -1
O problema com isso é que head -1
retornará a primeira linha do fluxo inteiro dos dados que são canalizados para ele.
Tente este comando awk
:
jack_lsp -p | awk '/input/{print previous_line}{previous_line=$0}'
Ele imprimirá a linha antes de cada linha que contiver a string "input". Aqui está o resultado para seus dados de exemplo:
user@host:~$ cat <<HEREDOC | awk '/input/{print previous_line}{previous_line=$0}'
firewire_pcm:analog-1_out
properties: input,physical,terminal,
firewire_pcm:analog-2_out
properties: input,physical,terminal,
firewire_pcm:analog-1_in
properties: output,physical,terminal,
firewire_pcm:analog-2_in
properties: output,physical,terminal,
HEREDOC
firewire_pcm:analog-1_out
firewire_pcm:analog-2_out
Para obter mais informações sobre essa abordagem awk
, consulte a postagem a seguir:
Você pode realizar o mesmo usando sed
:
<!-- language: bash -->
jack_lsp -p |sed -n '/input/{x;p;d;}; x'
Para obter mais informações sobre essa abordagem sed
, consulte a postagem a seguir:
No seu caso particular, parece que a string com a qual você está combinando (isto é, "entrada") não ocorre na linha anterior, então você pode filtrar essas linhas usando grep
também, ou seja:
jack_lsp -p | grep -B1 'input' | grep -v 'input
Você também pode obter o mesmo resultado que a abordagem awk
acima, complementando grep
com alguns scripts de shell, embora o resultado não seja tão compacto:
jack_lsp -p | (
unset previous_line;
while read line; do
if grep -q input <<< "${line}" && [[ -n "${previous_line}" ]]; then
echo "${previous_line}";
fi;
previous_line="${line}";
done
)