【问题标题】:awk find between patterns and expand variableawk 在模式之间查找并扩展变量
【发布时间】:2013-11-18 09:56:34
【问题描述】:

我有两个关于“awk”的问题。在 bash 脚本中,我想在两个模式之间从文件中提取与单词“found”匹配的行。我用这个:

awk '/$Pattern START/ {p=1} p && /found/ {print "line_"NR": "$0}; /$Pattern OK/ {p=0}' file2.txt

问题:

1. The variable Pattren is not expanded in the syntax presented
2. I want to specify with "or" multiple end patterns something like this:
 awk '/$Pattern START/ {p=1} p && /found/ {print "line_"NR": "$0}; /$Pattern {OK,NOT}/ {p=0}' file2.txt

谢谢。

【问题讨论】:

  • 变量不会在单引号内展开。
  • 所以你使用的是我在stackoverflow.com/a/19999013/1983854中建议的awk命令
  • 这样工作:awk '/'$Pattern' START/ {p=1} p && /found/ {print "line_"NR": "$0}; /'$Pattern' OK/ {p=0}' file2.txt
  • 为什么 awk 不是 grep
  • 我使用 awk 因为我想获取行号。

标签: bash awk


【解决方案1】:

您需要在awk 中声明变量才能使用它们 这里有两个示例来打印所有包含 home 的行

pattern="home"
awk -v pat="$pattern" '$0~pat'

awk '$0~pat' pat="$pattern"

对于 OPs 数据,它将是:

awk -vpat="$Pattern" '$0~pat" START" {p=1} p && /found/ {print "line_"NR": "$0} $0~pat" (OK|NOK)" {p=0}' file2.txt

【讨论】:

    【解决方案2】:

    在这种情况下,您可以使用grepsed 而不是awk

    grep "found" file|sed "s/.*pattern1\(.*\)pattern2.*/\1/g"
    

    【讨论】:

    • 我还需要找到匹配项的行号,因为我使用 awk。我通过扩展变量解决了第一个问题,但仍然是第二个。
    【解决方案3】:

    工作过:

    1. awk '/'$Pattern' START/ {p=1} p && /found/ {print "line_"NR": "$0}; /'$Pattern' OK/ {p=0}' file2.txt
    2. awk '/'$Pattern' START/ {p=1} p && /found/ {print "line_"NR": "$0}; /'$Pattern' OK|NOK/ {p=0}' file2.txt
    

    【讨论】:

    • 不要在awk 代码中使用变量,使用-v 声明它们。查看我更新的帖子。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多