regex - 使用 GREP 和 AWK 从文件中提取子字符串的值

标签 regex bash ubuntu awk grep

我有一个名为 的文件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/

相关文章:

linux - Cronjob 没有运行 bash 脚本

ruby-on-rails - example.com 重定向您的次数过多。 ERR_TOO_MANY_REDIRECTS

javascript - jQuery 选择器多选菜单/正则表达式

javascript - 我如何编写一个从后面开始阅读的正则表达式?

java - 如何在shell中获取java输出

regex - 在 Bash 中使用 2 个不同的分隔符拆分字符串

c# - MVC4 站点 Mono 3.2.1 ubuntu 13.04 Nginx 移动 View

linux - 在 Ubuntu 9.04 上为 SimpleScalar 安装 gcc

python - 使用 python 正则表达式进行双字母匹配

带有 sed 的正则表达式,跨多行搜索