【问题标题】:using GREP and AWK to extract a value of a substring from a file使用 GREP 和 AWK 从文件中提取子字符串的值
【发布时间】:2021-02-27 14:29:24
【问题描述】:

我有一个名为 grepExamples 的文件,例如:

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 找卡罗尔 (等等)

【问题讨论】:

  • 那么,预期的输出是什么?
  • 对于校友 123,乔纳斯
  • 请编辑完整的预期输出到原始帖子。谢谢。
  • 我刚刚在帖子里做了
  • 我不完全确定您的问题,但grep -ioP 'alumni.*\[123]="\K[^"]+(?=")'grep -ioP 'teacher.*\[124]="\K[^"]+(?=")' 是否为您提供了预期的输出? (这不需要 awk,我假设你有 GNU grep 和 PCRE 选项可用)

标签: regex bash ubuntu awk grep


【解决方案1】:

这个小 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

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2015-05-10
    • 1970-01-01
    • 2013-04-09
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多