使用sed或awk从具有特定单词的行中提取第n行?

时间:2014-05-30 06:56:30

标签: regex bash shell awk sed

在终端输出

hg标签:

tip                              596:bb834c42599f
P_SONY_1004.21.15                595:db10157b1515
P_PHILIPS_1000.21.2              590:67b7e71f76b4
P_SONY_1004.21.2                 539:2b50e157e217
P_SONY_10015.21.2                533:15160fyafd88
P_creative.21.1                  512:cdac14a00df4
P_SONY_1004.15.5                 500:21affdf1bbfd
P_SONY_1002.15.5                 466:a7bad21505ca
P_SONY_1002.15.15                424:efbe741500bb
P_creative.15.2                  420:415c415a65fa
P_SONY_1004.15.1                 414:24f1ab415c15
P_PHILIPS_1000.15.1              412:5d151556c288
P_SONY_1002.15.1                 410:bf1f5af64ebb
P_SONY_1002.15.1                 390:152e0f4ec815
P_creative.8.2                   370:ecdc64f8a4b4
P_creative.8.1                   350:5b8e81bd725a
P_creative.7.5                   343:221d5c15efa6
P_creative.6.1                   222:62115db1e015
从这个输出

我必须从包含“创意”字

的行中提取第二行

我试过了:

hg tags | awk '/creative/{print $1;}'

其输出:

P_creative.21.1
P_creative.15.2
P_creative.8.2
P_creative.8.1
P_creative.7.5
P_creative.6.1

但我只想要这个作为输出:     P_creative.15.2

如何更改命令以将“P_creative.15.2”作为输出,如何在shell脚本中使用它?

我也可以从中提取“15.2”吗?

5 个答案:

答案 0 :(得分:7)

您可以c根据需要获得c匹配:

awk -v c=2 '/creative/{count++;}count==c{print $0;exit}' file

(以上将打印整行)

获得第一个字:

awk -v c=2 '/creative/{count++;}count==c{print $1;exit}' file

答案 1 :(得分:3)

像这样:

awk '/creative/{if(++p==2){gsub(/.*creative./,"");print $1;exit}}' f

要将结果分配给变量,请使用此$()

VERSION=$(awk '/creative/{if(++p==2){gsub(/.*creative./,"");print $1;exit}}' f)

答案 2 :(得分:2)

对于第二个实例:

hg tags | awk '/creative/{print $1;}' | head -2 | tail -1

更一般地说,$ n标识所需的实例:

n=2
hg tags | awk '/creative/{print $1;}' | head -$n | tail -1

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -n '/creative/{x;/./{x;p;q};x;H}' file

使用保留空间作为标志。可以改编:

sed -nr '/creative/{H;x;/^(\n[^\n]*){5}/{x;p;q};x}' file

找到第5条这样的线。

答案 4 :(得分:1)

另一种方式:

awk '/creative/{print $1;}' yourfile | sed -n '2p'

仅获取版本:

awk '/creative/{print $1;}' yourfile | sed -n '2s/[^.]*\.\(.*\)/\1/p'

<强>测试

$ awk '/creative/{print $1;}' file | sed -n '2p'
P_creative.15.2
$ awk '/creative/{print $1;}' file | sed -n '2s/[^.]*\.\(.*\)/\1/p'
15.2