我有一个名为 的文件grep示例 喜欢 :
ALUMNI=([123]="Jonas" [124]="Anna")
TEACHERS=([123]="John" [124]="Carol")
读作ALUMNI=(
[123]="Jonas"
[124]="Anna"
)
TEACHERS=(
[123]="John"
[124]="Carol"
)
我想制作一个函数来提取名称,给定角色和 id我尝试使用 greps
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")
不知道如何继续...我只想搜索 alumni 123,然后找到 Jonas
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
解释为多行脚本:搜索.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
关于regex - 使用 GREP 和 AWK 从文件中提取子字符串的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64857207/