我的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
答案 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
。a
,因为没有条件,所有行都会出现这种情况。 因此,当正则表达式不匹配时,a
将设置为当前行的第二个字段。当正则表达式匹配时,在设置为当前行之前打印a
(包含前一行)。
答案 3 :(得分:1)
您可以保存上一个第2列,当到达行Priority: important
时,打印上一个值:
$ awk '/^Priority.*important/{print previous2}{previous2=$2}' foo.txt
apt
hostname