Chr*_*own 4 grep text-processing
我需要获取程序的多行输出,匹配一个字符串,并返回所有匹配项的前一行。
程序输出示例:
$ jack_lsp -p
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,
$
Run Code Online (Sandbox Code Playgroud)
例如,我需要匹配“输入”,并返回所有匹配项的前一行。所以在这个例子中,预期的输出是:
firewire_pcm:analog-1_out
firewire_pcm:analog-2_out
Run Code Online (Sandbox Code Playgroud)
这是我所拥有的,但它只返回第一个匹配项:
$ jack_lsp -p | grep -B1 input | head -1
firewire_pcm:analog-1_out
$
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这是您正在尝试的命令:
jack_lsp -p | grep -B1 input | head -1
Run Code Online (Sandbox Code Playgroud)
这样做的问题是head -1
将返回通过管道传输到它的整个数据流的第一行。
试试这个awk
命令:
jack_lsp -p | grep -B1 input | head -1
Run Code Online (Sandbox Code Playgroud)
它将打印出包含字符串“input”的每一行之前的行。这是您的示例数据的结果:
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
Run Code Online (Sandbox Code Playgroud)
有关此awk
方法的更多信息,请参阅以下帖子:
您可以使用sed
以下方法完成同样的事情:
<!-- language: bash -->
jack_lsp -p |sed -n '/input/{x;p;d;}; x'
Run Code Online (Sandbox Code Playgroud)
有关此sed
方法的更多信息,请参阅以下帖子:
在您的特定情况下,您匹配的字符串(即“输入”)似乎没有出现在前一行中,因此您也可以使用过滤掉这些行grep
,即:
jack_lsp -p | grep -B1 'input' | grep -v 'input
Run Code Online (Sandbox Code Playgroud)
您还可以awk
通过补充grep
一些 shell 脚本来获得与上述方法相同的结果,尽管结果并不那么紧凑:
jack_lsp -p | awk '/input/{print previous_line}{previous_line=$0}'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3062 次 |
最近记录: |