获得特定的一行

时间:2014-04-03 10:13:16

标签: bash

我的foo.txt包含,

Package: apt
Priority: important
Section: admin
Installed-Size: 3414
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Package: firefox
Priority: optional
Section: web
Installed-Size: 63988
Maintainer: Ubuntu Mozilla Team <ubuntu-mozillateam@lists.ubuntu.com>
Package: hostname
Priority: important
Section: admin
Installed-Size: 83
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>

如果相应的pripority很重要,我想要pacakge名称。如果以关键字Priority开头的行中的第2列,则显示当前行之前的行的第2行。

我试过这个命令,

awk '/^Priority && $2=="important"/ {print $0 }' ~/Desktop/awk

但它也没有显示当前的行。如果你在awk中提供答案会更好。

预期产出:

apt
hostname

4 个答案:

答案 0 :(得分:2)

您可以在斜杠之间放置正则表达式,但不能在斜杠之间使用逻辑运算符。

试试这个:

awk -F": " '$1 ~ /^Priority/ && $2 == "important" {print last_value;} {last_value = $2;}' <your file>

答案 1 :(得分:1)

使用awk:

awk -F' *: *' '$1=="Package"{p=$2;next} $1=="Priority"&&$2=="important"{print p}' file
apt
hostname

答案 2 :(得分:1)

awk -F': ' '/^Priority: important/ {print a} {a=$2}' foo.txt

输出:

apt
hostname

说明:

  • -F': '将字段分隔符设置为冒号,后跟空格。
  • awk需要条件后跟 {statement} ,条件/^Priority: important/匹配以&#34开头的行;优先级:重要&#34;以下语句{print a}打印出名为awk的内部a变量。因此,当正则表达式匹配时,会打印a
  • 最后我们有另一个 {statement} 但没有条件 - 这会将当前行的第二个字段分配给a,因为没有条件,所有行都会出现这种情况。

因此,当正则表达式不匹配时,a将设置为当前行的第二个字段。当正则表达式匹配时,在设置为当前行之前打印a(包含前一行)。

答案 3 :(得分:1)

您可以保存上一个第2列,当到达行Priority: important时,打印上一个值:

$ awk '/^Priority.*important/{print previous2}{previous2=$2}' foo.txt
apt
hostname