我有一个名为grep的文件示例如:
ALUMNI=([123]="Jonas" [124]="Anna")
TEACHERS=([123]="John" [124]="Carol")
读取为
ALUMNI=(
[123]="Jonas"
[124]="Anna"
)
TEACHERS=(
[123]="John"
[124]="Carol"
)
我想制作一个函数来提取名称、给定角色和id
我试着用这样的grep
grep -HiRE "(ALUMNI)[^)]*((123)W+)([A-Z][a-z]+)(")" --include grepExamples
grep -HiRE "(ALUMNI)[^)]*((124)W+)([A-Z][a-z]+)(")" --include grepExamples
允许我识别字符串中对我感兴趣的部分
也是如此
grep -HiRE "(ALUMNI)[^)]*((123)W+)" --include grepExamples
grep -HiRE "(ALUMNI)[^)]*((124)W+)" --include grepExamples
它允许我指向我需要的值之前的文本
但是,如果我试图管道到awk,我无法获得名称本身
与第一个例子
$ grep -HiRE "(ALUMNI)[^)]*((123)W+)" --include grepExamples
grepExamples:ALUMNI=([123]="Jonas" [124]="Anna")
$ grep -HiRE "(ALUMNI)[^)]*((123)W+)" --include grepExamples | awk '{ print $1; }'
grepExamples:ALUMNI=([123]="Jonas"
$ grep -HiRE "(ALUMNI)[^)]*((123)W+)" --include grepExamples | awk '{ print $2; }'
[124]="Anna")
不知道如何继续。。。
我只想为123校友烧钱,然后得到乔纳斯o替124老师找卡罗尔(等等(
这个小awk命令可能会有所帮助:
awk -v role=TEACHERS -v id=124 -F'[=()" ]*'
'$1==role{for(i=2;i<=NF;i+=2){if($i=="["id"]"){print $(i+1)}}}' file
Carol
解释为多行脚本:
search.awk
BEGIN {
# Gives us records like this
# ALUMNI [123] Jonas [124] Anna
# TEACHERS [123] John [124] Carol
FS="[=()" ]*"
}
# When the first field matches the role ...
$1==role {
# loop through id fields
for(i=2;i<=NF;i+=2){
# if the id matches, print the name
if($i=="["id"]"){
print $(i+1)
}
}
}
运行脚本:
awk -v role=TEACHERS -v id=124 -f search.awk file