比赛后的第一场比赛

时间:2014-12-28 17:13:02

标签: awk

鉴于this file,我想 打印install:行之后的第一个@ bash行。请参阅 完整输入的文件,但这是一个示例

@ base-files
; few lines
install: x86_64/release/base-files/base-files-4.2-3.tar.xz 46428 6372358800e589b
; couple of lines
install: x86_64/release/base-files/base-files-4.1-1.tar.bz2 49519 f91ed6eab060c3

@ bash
; few lines
install: x86_64/release/bash/bash-4.1.17-9.tar.xz 1107128 e49b8d67d59d8617dfa31c
; couple of lines
install: x86_64/release/bash/bash-4.1.16-8.tar.xz 1106812 5aa652ddc0a5d65f4af1e2
source: x86_64/release/bash/bash-4.1.16-8-src.tar.xz 6614280 79bb3ddc67d8f0d3da6

@ bash-completion
; few lines
install: x86_64/release/bash-completion/bash-completion-1.3-1.tar.bz2 117489 538
source: x86_64/release/bash-completion/bash-completion-1.3-1-src.tar.bz2 216503

输出应为

install: x86_64/release/bash/bash-4.1.17-9.tar.xz 1107128 e49b8d67d59d8617dfa...

我有这个命令,但它会打印包含两个的所有行。

awk '/@ bash$/,/install:/' setup.ini

除了我创建的答案之外

awk '$1=="@" {c=$2} $1=="install:" && c=="bash" {print;exit}'

2 个答案:

答案 0 :(得分:5)

您可以使用:

awk '/@ bash$/{p=1} p&&/install:/{print; exit}' setup.ini
install: x86_64/release/bash/bash-4.1.17-9.tar.xz 1107128 e49b8d67d59d8617dfa31c

答案 1 :(得分:4)

awk '/^@ bash/ { p = 1 } /^install:/ && p == 1 { print; p = 2 }'

变量p默认为0;读取@ bash行时,将其设置为1;读取下一个安装行时,将其打印并将p设置为2,这样就不会打印其他安装行。我想你也可以退出而不是设置p = 2