Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用awk、sed、grep解析具有特定标题的文件节_Awk_Sed_Grep - Fatal编程技术网

使用awk、sed、grep解析具有特定标题的文件节

使用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

我有一个文件,我被分解成一堆不同的标题。我需要把特定标题下的某些字段刷出来。例如,我想在“优先用户”标题下打印姓名。我可以使用grep对该段进行grep并打印名称(如grep-a10“PRIORITY USERS”| grep name:),但我需要将输出限制为PRIORITY USERS标题下的名称。问题是每个标题下的条目数量不同,所以我不能使用固定数量的grep-a选项

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