【问题标题】:Substituting shell variables into awk pattern looking scanning through file将 shell 变量替换为 awk 模式以查看文件扫描
【发布时间】:2020-02-24 07:11:34
【问题描述】:

注意:我是 bash 脚本和 awk 命令的菜鸟 - 请原谅我犯的任何愚蠢错误。

我无法将 shell 变量替换为我的 awk 模式。我正在尝试扫描文件,找到文件中第一次出现的特定字符串,然后按顺序打印成功的每一行,直到遇到空字符串/行。

我事先不知道要搜索的字符串,我想替换为该变量。

当我使用直接指定的字符串(例如“

:”)运行它时,它可以完美运行。我已经搜索了 awk 模式的工作原理以及如何替换变量。我已经尝试将 -v 标志用于 awk,直接使用 shell 变量 - 没有任何效果。

funcName="<${2}>:"

awk=`awk -v FN="$funcName" '/FN/,/^$/' "$ofile"`

rfile=search.txt

echo -e "$awk" > "$rfile"

错误只是没有打印。我想打印我想要的字符串和下一个空行之间的所有行。

【问题讨论】:

    标签: shell awk command-line


    【解决方案1】:

    您能否尝试以下操作,尚未测试,因为没有明确的示例,但应该可以。

    funcName="<${2}>:"
    awk_result=$(awk -v FN="$funcName" 'index($0,FN){found=1} found; /^$/{found=""}' "$ofile")
    rfile=search.txt
    echo -e "$awk_result" > "$rfile"
    

    在 OP 的尝试中修复的问题:

    1. 切勿将变量名称与二进制名称或关键字名称保持相同,因此将 awk 变量名称更改为 awk_result
    2. 现在不赞成使用反引号,因此请始终将您的变量包装起来,以使 var=$(......your commands....) 中的值固定为 awk_result 变量。
    3. 现在让我们谈谈awk 代码修复,我使用index 方法检查变量FN 的值是否存在于一行中,然后制作一个标志(一个变量为真)并将其设为假直到行根据 OP 的要求是空的。

    【讨论】:

    • 你是救生员
    • @victor__von__doom 需要进行重大更改,因为 1)当您需要将变量用作字符串时,您试图将其用作正则表达式,并且 2)您试图在标志时使用范围表达式总是更好的方法(见stackoverflow.com/q/23934486/1745001)。
    猜你喜欢
    • 2020-02-25
    • 2014-01-04
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2018-08-15
    • 2016-01-02
    相关资源
    最近更新 更多