使用awk、sed、grep解析具有特定标题的文件节
我有一个文件,我被分解成一堆不同的标题。我需要把特定标题下的某些字段刷出来。例如,我想在“优先用户”标题下打印姓名。我可以使用grep对该段进行grep并打印名称(如grep-a10“PRIORITY USERS”| grep name:),但我需要将输出限制为PRIORITY USERS标题下的名称。问题是每个标题下的条目数量不同,所以我不能使用固定数量的grep-a选项使用awk、sed、grep解析具有特定标题的文件节,awk,sed,grep,Awk,Sed,Grep,我有一个文件,我被分解成一堆不同的标题。我需要把特定标题下的某些字段刷出来。例如,我想在“优先用户”标题下打印姓名。我可以使用grep对该段进行grep并打印名称(如grep-a10“PRIORITY USERS”| grep name:),但我需要将输出限制为PRIORITY USERS标题下的名称。问题是每个标题下的条目数量不同,所以我不能使用固定数量的grep-a选项 USERS: name: 286 fields1 fi
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
你能帮忙吗
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
输入文件
USERS:
name: 286
fields1
fields 3
name: 123
fieldx: test
PRIORITY USERS:
name: jack
field1: 8
name: Joe
name: bob
field1: xyz
name: tempo
kind: Text
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
输出应为:
PRIORITY USERS:
name: jack
name: bob
name: tempo
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
提前感谢大家cat sample.csv
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
sed-n'/PRIORITY USERS/,/SEGMENT3/p'sample.csv | grep name
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
name: Jack
name: Joe
“/PRIORITY USERS/,/SEGMENT3/”PRIORITY USERS是开始模式,SEGMENT3是结束模式,我们只打印出这两个模式之间的行,然后得到
名称
看起来顶级标题可以描述为出现在以最多一个空格开头的行上。如果是这样的话,那么下面的优点是不需要在目标标题之后了解顶级标题:
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
sed -r -n '/^ ?PRIORITY USERS/,/^ ?[^ ]/ {/name:/p ; }'
(对于扩展的正则表达式支持,某些版本的sed需要-E而不是-r。)
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
在任何情况下,都不需要同时调用sed
和grep
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
此处使用“awk”的一个优点是,您可以在正则表达式中使用“?”而无需设置标志:
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
awk '/^ ?PRIORITY USERS/ {s++; next}
s==1 {if (/^ ?[^ ]/) {s++} else if (/name:/) {print}}'
awk
救援
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
$ awk -v RS= 'f{print;exit} /PRIORITY USERS:/{f=1}' file
name: ack
field1: 8
name: Joe
我想,还有一个不成文的要求是过滤掉非名字的行。为此,请稍微更改脚本
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
$ awk -F'\n' -v RS= 'f{for(i=1;i<=NF;i++) if($i~/name:/) print $i;exit}
/PRIORITY USERS:/{f=1}' file
name: ack
name: Joe
注意:您的输出示例缺少“Joe”。如果你错过了“鲍勃”,那是一个很好的笑话
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO
awk -vRS= -F'\n' '/SEGMENT/{a=0}a{$0=$1}/PRIORITY/{a=1}a' file
PRIORITY USERS:
name: jack
name: bob
name: tempo
由于您的输入格式差异很大,有些标题行以空格开头,有些标题行以空格开头,有些标题行以空格开头,有些标题行以分号结尾,有些标题行以空格开头,因此上述内容非常复杂,等等,它假设您刚刚错过了预期输出中的
name:joe
。Hi-thx-每个段上方没有空行-有时有,有时没有,我不确定sed命令是否能正常运行。。我不能在awk命令下工作all@theuniverseisflat-你误解了。在您的示例中,标题出现在第1列中没有空格或第1列中只有一个空格的行上。我已经用三种不同的awk(Mac OS awk 20070501,gawk和mawk)测试了awk程序。Hi-Thx作为反馈。。它适用于文件的一段,但当我尝试另一段时,它会在其他段下列出名称。。不确定为什么它只适用于一个段,而不适用于另一个段。请尝试再次从末端模式“SEGMENT3”Hi thx中删除3,以获得您的帮助。。我修改了输入文件。您的解决方案仅打印优先级用户下的第一组数据(抱歉,我未能包括每个段下的附加数据)"请参阅上面修改的输入文本什么表示块的结束?SEGMENT3标记?您好,很抱歉延迟响应。每个部分都由名称明确标识。至少有10个部分和按顺序显示的过程:用户:装载服务等。Thx再次提供帮助您真的有一些标题行开始于e行和后缀为:
(例如“优先用户:”),而其他人可以在它们前面/后面有空格,在它们后面没有:
(例如(“段3”)?如果是,我们如何区分文件中任何其他行的标题?如果不是-编辑您的问题,使您的示例输入准确,以便我们可以尝试帮助您解决真正的问题,而不是您实际上没有的问题。还有为什么name:joe
不在您的预期输出中?
USERS:
name: 286
fields1
fields 3
name: 286
fields 4
PRIORITY USERS:
name: Jack
field1: 8
name: Joe
SEGMENT3
name: ginger
name: max
Non-USERS
Name: JOJO