【问题标题】:(awk?) match between shell variable and string(awk?)shell变量和字符串之间的匹配
【发布时间】:2019-12-25 00:32:28
【问题描述】:

我有一个这样的文件(其中 xxxn = 任意随机字符串):

xxxx1
xxxx2
xxxx3
xxxx4
END
xxxx5
xxxx6
xxxx7
END
xxxx8
...

我想在 shell 变量和下一个 END 之间进行匹配。 假设shell变量等于xxxx2,我想:

xxxx3
xxxx4

我认为 awk 可能是完成这项工作的工具,但我对其他命令持开放态度。

如果我像这样硬编码(再次使用 xxxx2),我就可以正常工作了:

awk '/xxxx2/{flag=1;next}/^END/{flag=0}flag' file

但我希望它引用一个 shell 变量和要转义的符号。 我试过了:

awk -v var="$my_var" '/~var/{flag=1;next}/^END/{flag=0}flag' file

(看完这篇https://stackoverflow.com/a/39384347/11633601) 但这什么也没输出。

谢谢。

【问题讨论】:

    标签: regex awk


    【解决方案1】:

    Var 应该用 -v 声明 awk How do I use shell variables in an awk script?

    所以应该这样做:

    my_var="xxxx2"
    awk -v var="$my_var" '/END/ {exit} f; $0==var {f=1}' file
    xxxx3
    xxxx4
    

    您可以将f=0 设置为停止打印,但exit 更好,因为它会停止处理数据。

    awk -v var="$my_var" '/END/ {f=0} f; $0==var {f=1}' file
    

    【讨论】:

    • 我建议将f=1 替换为f=1; next 以从输出中删除xxxx2
    • @Cyrus 忘记了不应该打印xxxx2。与使用 next 相比,最好交换测试
    【解决方案2】:

    您可以将硬编码的xxxx2 替换为shell 变量,但在单引号之外,如果它包含空格,则将其加倍:

    awk /"$my_var"'/{flag=1;next}/^END$/{flag=0}flag' file
    

    此外,您应该考虑使用 ed 命令,而不是 this answer 指出的那样,这样它的可读性会更高:

    echo /"$my_var"'/+1,/^END$/-1p' | ed -s file -
    

    【讨论】:

    • 假设 OP 帖子中的第 2 行是 \xxxx2。然后你设置my_var="\xxxx2"。然后,由于您在awk 中使用变量的方式,您的代码将失败。您还可以将代码放入变量中并使其在您的awk 代码中执行。 (代码注入)
    猜你喜欢
    • 2023-01-30
    • 2019-04-02
    • 2016-08-27
    • 2019-10-17
    • 2020-04-06
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多