如何在bash脚本中使用awk处理多行记录?


13

example.txt在下面

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

我正在使用bash脚本,可以说我想从上面的文件中按餐厅名称搜索餐厅。询问用户输入的餐厅名称,它应打印有关该餐厅的信息(5行)。

awk '/McDonalds/> /KFC/' example.txt

我知道上面的代码行将打印与模式“ McDonalds”和“ KFC”相匹配的整行,但是将仅打印文本文件中的第一行,而不显示有关该餐厅的其余信息。我如何才能告诉它仅从餐厅名称的用户输入中打印所有信息(5行)?

Answers:


11

使用awk,您可以更改记录分隔符。默认情况下,它是换行符,因此文件的每一行都是一条记录。如果将RS变量设置为空字符串,awk将认为记录由空行分隔:

awk -v name="KFC" -v RS="" '$0 ~ "Restaurant: " name' example.txt

我不明白你的问题。相当模糊。是您没有得到的作业还是用法?
格伦·杰克曼

3

使用sed

$ sed -n '/KFC/,/^$/p' file
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

$ sed -n '/McDo/,/^$/p' file
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

说明

这是基本sed功能,您可以参考有用的SED单行脚本

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

添加说明。
宝马

但是,为什么建议的编辑被拒绝?我没有改变答案。我刚刚改善了格式。
雏菊

2
$ awk '$2=="KFC" {print; for(i=1; i<=4; i++) { getline; print}}' example.txt

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

上面的命令将获取并打印当前行的连续4行,因为它被馈入了for循环中。搜索模式$2=="KFC"将有助于从多行中获取特定行。


0

另一个可能的解决方案:

awk 'BEGIN{FS="\n";RS="\n\n"}{if($1=="KFC")print $0}' example.txt

{if($1=="KFC")print $0}可凝结只是$1 == "KFC",因为一个真正的状态默认动作是打印记录。
muru

0

从包含所需名称的行到包含单词的最后一行进行打印就足够了Phone(当然,假设所有条目都遵循相同的模式,并且始终具有Phone终止记录)

$> awk '/5 guys/,/Phone/' restaurants.txt                                     
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
$> awk '/McDonalds/,/Phone/' restaurants.txt                                  
Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

如果我们想使其复杂一点,我们可以在比赛结束后精确打印5行,如下所示:

awk '/McDonalds/{stop=NR+5}; NR<=stop ' restaurants.txt                    

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

stop变量将不会被设置,因此NR<=stop将不会打印任何内容,直到/McDonalds/{stop=NR+5;}部分实际设置了该变量,并且只有在我们找到匹配项时才会发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.